题目
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
链接:最长公共前缀.
示例
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
示例 2:
输入: [“dog”,“racecar”,“car”]
输出: “”
解释: 输入不存在公共前缀。
解题过程
看到这个题目的瞬间,我就感觉有一种我知道怎么做但我做不出来的感觉。不慌,我们就用最简单的数组知识做,分析题目:最长公共前缀,首先它是最长的,所以我们就要遍历数组;其次它是公共的,意味着最短的字符串也应该包含了这个前缀:然后它是前缀,意味着每次对比都应该是从每个字符的第一位开始对比。
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String s="";
String min = strs[0];
for(int j=1; j<strs.length; j++){
if(strs[j].length() < min.length()){
min=strs[j];
}
}
if (min=="") return "";
for(int i=0; i<min.length(); i++){//每个字符串的字符
for(int j=0; j<strs.length; ){//数组里的字符串
if(strs[j].substring(0, i+1).equals(min.substring(0, i+1))){
if(j==(strs.length-1)){
s+=min.substring(i, i+1);
}
j++;
}
else break;
}
}
return s;
}
}
在解答这一题时,涉及到了数组的长度和字符串的长度,都用的是length。
length——数组的属性;
length()——String的方法;
size()——集合的方法;
这道题官方给出了四种解法,感觉第二种算法和我的想法差不多,都是先看列再看行(关注每个字符串的第一个字符是否相等,然后再看第二个第三个…)但是他的代码好优雅啊,嘤嘤嘤。。。
class Solution {
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);
for (int j = 1; j < strs.length; j ++) {
if (i == strs[j].length() || strs[j].charAt(i) != c)//如果i大于当前字符串长度则会返回false,就不需要像我一样找出最短字符串来避免这个问题{
return strs[0].substring(0, i); //妙啊,结果肯定是字符串的子串,为啥我还要重新建一个字符串
}
}
}
return strs[0];
}
}
滴,有一个新知识:charAt方法,语法 public char charAt(int index),取出字符串的某个字符。那我们前几天学到的substring与这个方法有什么不同呢,charAt返回的是字符型数据,而且只有一个。且用charAt也可以判断当前字符串的长度是否大于i。