解法⼀ 垂直⽐较
我们把所有字符串垂直排列,然后⼀列⼀列的⽐较,直到某⼀个字符串到达结尾或者该列字符不完全相同。
//这个函数判断 index 列的字符是否完全相同
public boolean isSameAtIndex(String[] strs, int index) {
int i = 0;
while (i < strs.length - 1) {
if (strs[i].charAt(index) == strs[i + 1].charAt(index)) { //charAt的结果是竖直的
i++;
} else {
return false;
}
}
return true; }
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0 || strs == null)
retur
n "";
//得到最短的字符串的⻓度
int minLength = Integer.MAX_VALUE;
for (int i = 0; i < strs.length; i++) {
if (strs[i].length() < minLength) {
minLength = strs[i].length();
}
}
int j = 0;
//遍历所有列
for (; j < minLength; j++) {
//如果当前列字符不完全相同,则结束循环
if (!isSameAtIndex(strs, j)) {
break;
}
}
return strs[0].substring(0, j);
}
官方写法:
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) return ""; //判断是否为空
//遍历所有列
for (int i = 0; i < strs[0].length() ; i++){
char c = strs[0].charAt(i); // 保存 i 列第 0 ⾏的字符便于后续⽐较
//⽐较第 1,2,3... ⾏的字符和第 0 ⾏是否相等
for (int j = 1; j < strs.length; j ++) {
/**
* i == strs[j].length() 表明当前⾏已经到达末尾
* strs[j].charAt(i) != c 当前⾏和第 0 ⾏字符不相等
* 上边两种情况返回结果
*/
if (i == strs[j].length() || strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0];
}