着魔了,只想用一个循环去解。
最新版本(时间复杂度O(n/2+))
public static String longestCommonPrefix(String[] strs) {
int i = 0,j = strs.length - 1,k = strs[0].length();
while(i <= j && k > 0) {
int length = strs[i].length() < strs[j].length() ? strs[i].length() : strs[j].length();
k = length < k ? length : k;
String prefix = strs[0].substring(0, k);
if(strs[i].startsWith(prefix) && strs[j].startsWith(prefix)) {
i++;j--;
} else {
k--;
}
}
return strs[0].substring(0, k);
}
老版本2
public String longestCommonPrefix(String[] strs) {
if(strs.length==1) {
return strs[0];
}
int i = 0,j = 1;
while(i < strs[0].length() && j < strs.length) {
if(i >= strs[j].length() || strs[j].charAt(i) != strs[0].charAt(i)) {
return strs[0].substring(0, i);
}
if(j == strs.length - 1 && i < strs[0].length() - 1) {
i++;
j = 1;
} else {
j++;
}
}
return strs[0];
}
老版本1
public static String longestCommonPrefix(String[] strs) {
if(strs.length==1) {
return strs[0];
}
//i是字符串截取指针, j是数组指针(i只会增加,而j可能重置)
int i = 0,j = 1;
//保存截取字符串(最大前缀,随i递增而变长)
String str = "";
while(i < strs[0].length() && j < strs.length) {
//只需要基于数组中第一个字符串做截取
String s = strs[0].substring(0, i + 1);
if(!strs[j].startsWith(s)) {
return str.length() > 0 ? str.substring(0, i) : "";
}
if(j == strs.length - 1 && i < strs[0].length() - 1) {
i++;
j = 1;
} else {
j++;
}
//赋值进行下一轮比较
str = s;
}
return str;
}