题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成
优化题解
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0)
return "";
String ans = strs[0];
for (int i = 0; i < strs.length; i++) {
int j=0;//for循环还要用,定义在外面
for (;j<ans.length()&&j<strs[i].length();j++){
if(ans.charAt(j)!=strs[i].charAt(j))
break;
}
ans = ans.substring(0,j);//左闭右开 j取不到
//如果查找过程中出现了 ans 为空的情况,则公共前缀不存在直接返回;
if(ans.equals(""))
return ans;
}
return ans;
}
}
进阶题解
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
Arrays.sort(strs);//排序 字典序排列,也称为字母序排列
//记住此题是按照字典序来排序的
String st =strs[0];//取第一个字符
String en =strs[strs.length-1];//取最后一个字符串
int i;
int num = Math.min(st.length(),en.length());
for (i=0;i<num&&st.charAt(i)==en.charAt(i);i++);
String res = st.substring(0,i);
return res;
}
}
按照字典序排序后:
class Solution {
public String longestCommonPrefix(String[] strs) {
String prefix = strs[0];//先默认第一个字符串是最长公共前缀
for (int i = 1; i < strs.length; i++) {
while(strs[i].indexOf(prefix)!=0){//能找到这个前缀,indexOf==0说明是公共前缀
prefix=prefix.substring(0,prefix.length()-1);//删除末尾的字符
if(prefix.isEmpty()){
return "";
}
}
}
return prefix;
}
}
反向思路,indexOf用的很巧妙
使用indexOf判断是否是公共前缀,如果不是,则每次删去末尾的字符,然后继续判断,直到为"",直接返回
总结
- 遍历,两个字符串挨个比较字母,需要用到subtring
- 先按照字典序排序,然后直接比较第一个和最后一个,第一个就不需要和所有字符串挨个比较了
- 先假设第一个就是最长公共前缀,如果不符合就挨个删除末尾的字符,直到符合为止
拓展
用到的一些方法
- ans = ans.substring(0,j);//左闭右开 j取不到
- Arrays.sort(strs);//排序 字典序排列,也称为字母序排列
- int num = Math.min(st.length(),en.length());
-
if(ans.equals("")) return ans; if(prefix.isEmpty()){ return ""; } 两个等价的写法
相关链接
https://leetcode.cn/problems/longest-common-prefix/description/