【問題描述】[中等]
編寫一個函數來查找字符串數組中的最長公共前綴。如果不存在公共前綴,返回空字符串 ""。示例 1:輸入: ["flower","flow","flight"]
輸出: "fl"
示例 2:輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。
說明:所有輸入只包含小寫字母 a-z 。
【解答思路】
1. 橫向掃描
時間復雜度:O(N^2) 空間復雜度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}String prefix
= strs
[0];int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {prefix
= longestCommonPrefix(prefix
, strs
[i
]);if (prefix
.length() == 0) {break;}}return prefix
;}public String
longestCommonPrefix(String str1
, String str2
) {int length
= Math
.min(str1
.length(), str2
.length());int index
= 0;while (index
< length
&& str1
.charAt(index
) == str2
.charAt(index
)) {index
++;}return str1
.substring(0, index
);}
}
2. 縱向掃描
時間復雜度:O(N^2) 空間復雜度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int length
= strs
[0].length();int count
= strs
.length
;for (int i
= 0; i
< length
; i
++) {char c
= strs
[0].charAt(i
);for (int j
= 1; j
< count
; j
++) {if (i
== strs
[j
].length() || strs
[j
].charAt(i
) != c
) {return strs
[0].substring(0, i
);}}}return strs
[0];}
}
public String
longestCommonPrefix(String
[] strs
) {if (strs
.length
== 0) return "";for(int i
= 0;i
<strs
[0].length();++i
){for(int j
=1 ; j
<strs
.length
;j
++){if(i
== strs
[j
].length() || strs
[j
].charAt(i
)!=strs
[0].charAt(i
)){return strs
[0].substring(0,i
);}}}return strs
[0];}
2. 二分法
時間復雜度:O(mnlogm) 空間復雜度:O(1)
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int minLength
= Integer
.MAX_VALUE
;for (String str
: strs
) {minLength
= Math
.min(minLength
, str
.length());}int low
= 0, high
= minLength
;while (low
< high
) {int mid
= (high
- low
+ 1) / 2 + low
;if (isCommonPrefix(strs
, mid
)) {low
= mid
;} else {high
= mid
- 1;}}return strs
[0].substring(0, low
);}public boolean isCommonPrefix(String
[] strs
, int length
) {String str0
= strs
[0].substring(0, length
);int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {String str
= strs
[i
];for (int j
= 0; j
< length
; j
++) {if (str0
.charAt(j
) != str
.charAt(j
)) {return false;}}}return true;}
}
4. 分治
復雜度
class Solution {public String
longestCommonPrefix(String
[] strs
) {if (strs
== null
|| strs
.length
== 0) {return "";}int minLength
= Integer
.MAX_VALUE
;for (String str
: strs
) {minLength
= Math
.min(minLength
, str
.length());}int low
= 0, high
= minLength
;while (low
< high
) {int mid
= (high
- low
+ 1) / 2 + low
;if (isCommonPrefix(strs
, mid
)) {low
= mid
;} else {high
= mid
- 1;}}return strs
[0].substring(0, low
);}public boolean isCommonPrefix(String
[] strs
, int length
) {String str0
= strs
[0].substring(0, length
);int count
= strs
.length
;for (int i
= 1; i
< count
; i
++) {String str
= strs
[i
];for (int j
= 0; j
< length
; j
++) {if (str0
.charAt(j
) != str
.charAt(j
)) {return false;}}}return true;}
}
【總結】
1.縱橫交錯 二分分治
2. 字符串/數組題目遍歷 暴力再優化
轉載鏈接:https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-by-leetcode-solution/
總結
以上是生活随笔為你收集整理的[Leedcode][JAVA][第14题][最长公共前缀][二分][横竖扫描][分治]的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。