leetcode 14: 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"] 输出:"fl"
示例 2:
输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。
提示:
-
1 <= strs.length <= 200 -
0 <= strs[i].length <= 200 -
strs[i]仅由小写英文字母组成
Related Topics
字符串
思路1:
遍历每一列字符对比,但是不知道有多少行。实际上可以使用while(true)死循环,当符合不是前缀的条件时,可以直接break退出。
需要注意的是,在进行比较字符前,需要判断字符是否存在,也就是用index和字符串的length做比较。 如果不存在,那么就不需要再判断前缀了。
public String longestCommonPrefix(String[] strs) {
StringBuilder sb = new StringBuilder();
int index = 0;
//遍历每一列字符 由于不知道有一行字符串长度 使用true循环
boolean flag = true;
while(flag){
// 字符不存在 就不需要判断了
if(index>=strs[0].length()){
break;
}
//开始往后比较
for(int i = 1; i < strs.length;i++){
//先判断字符是否存在
//存在的话 不相等 说明不是前缀
if(strs[i].length()<= index || strs[i].charAt(index) != strs[i-1].charAt(index)){
flag = false; //不是前缀 可以退出while循环
break;//退出for循环
}
}
//flag == false 说明不是前缀 退出while循环
if(flag == false){
break;
}
//都相等 说明是前缀
sb.append(strs[0].charAt(index));
index++;
}
return sb.toString();
}
解答成功:
执行耗时:1 ms,击败了69.00% 的Java用户
内存消耗:39.3 MB,击败了5.00% 的Java用户
思路1改进:
参考leetcode官方解答,可以以第一行的长度为标准,时间复杂度都一样,就是代码看起来简洁了很多。
public String longestCommonPrefix(String[] strs) {
// 以第一行的字符串长度为标准
for(int i = 0 ; i < strs[0].length();i++){
char c = strs[0].charAt(i);
//跟剩下的字符串比较第i列的字符
for(int j = 1; j < strs.length;j++){
//第j列字符长度不够 或者 字符不等于c 前缀计算完毕
if(i == strs[j].length() || strs[j].charAt(i) != c){
return strs[0].substring(0,i);
}
}
}
//如果 全部比完 则strs[0]就是前缀
return strs[0];
}
解答成功:
执行耗时:1 ms,击败了69.00% 的Java用户
内存消耗:39.4 MB,击败了5.00% 的Java用户









