1. 神仙算法
public class Solution1 {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0)return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if(prefix.isEmpty()) return "";
}
}
return prefix;
}
}
2. 愚蠢的BF
public class Solution2 {
public String longestCommonPrefix(String[] strs) {
if (strs == null || 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];
}
}
3. 分治
public class Solution3 {
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return "";
return longestCommonPrefix(strs, 0, strs.length - 1);
}
private String longestCommonPrefix(String[] strs, int left, int right) {
if(left==right) return strs[left];
int mid = (left+right)>>>1;
String sl = longestCommonPrefix(strs, left, mid);
String sr = longestCommonPrefix(strs, mid + 1, right);
return commonPrefix(sl, sr);
}
private String commonPrefix(String s1, String s2) {
for (int i = 0; i < Math.min(s1.length(), s2.length()); i++) {
if(s1.charAt(i)!=s2.charAt(i))return s1.substring(0,i);
}
return s1.length()>s2.length()?s2:s1;
}
}
4. 二分查找
public class Solution4 {
public String longestCommonPrefix4(String[] strs) {
if(strs==null || strs.length == 0)return "";
int minLen = strs[0].length();
for(String item:strs)
minLen = Math.min(minLen, item.length());
int left = 0,right = minLen;
while(left<=right){
int mid = (left+right)>>>1;
if(isCommonPrefix(strs,mid))
left = mid+1;
else
right =mid-1;
}
return strs[0].substring(0, right);
}
private boolean isCommonPrefix(String[] strs, int len){
String str1 = strs[0].substring(0,len);
for (int i = 1; i < strs.length; i++)
if (!strs[i].startsWith(str1))
return false;
return true;
}
}