刷题的时候每次看到这题都会不由自主的跳过,不敢去做。今天剖析一下,学到的和已有的几种方法,供自己回忆复习吧。 leetcode.cn/problems/lo…
方法一:横向比较
将第一二个字符串比较得到的公共前缀,与第三个进行比较.
LCP(S1...Sn) = LCP(LCP(LCP(S1,S2),S3,...Sn)
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0){ //如果长度为0或字符串为空,则直接输出,
//但题目提示明确告知长度最小为1,所以在这道题,该if语句可以省去
return "";
}
String pre = strs[0]; //默认公共前缀为第一个字符串
int count = strs.length;
for(int i = 1 ; i < count ;i++){
pre = longestCommonPrefix(pre , strs[i]); //将上一次得到的公共前缀与本次遍历的字符串比较
if(pre.length() == 0) break;//一旦发现某两个没有检测出公共前缀就直接跳出,结束程序
}
return pre;
}
public String longestCommonPrefix(String str1 , String str2){
int size = Math.min(str1.length() , str2.length()); //以最短长度的为边界进行遍历比较
int index = 0; //这两个字符串公共前缀的长度
while (index < size && str1.charAt(index) == str2.charAt(index)) {
index++;
}
return str1.substring(0, index); //截str1从0开始到index结束的字符串
}
}
方法二:纵向
竖着比较,以第一个字符串,为标准。取出该字符串的第X个字符,去跟后面字符串的X字符比较。(x从0开始,若没有不符合的,就一直比较到str[0].length())
"flower"
"flow"
"fqqq"
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0) return "";
int size = strs[0].length(); //记录了第一个字符串的长度
int count = strs.length; //记录字符串的个数
// 先依次遍历每个字符串的第一个,若相同再是遍历每个字符串的第二个,依此类推
for(int i = 0 ; i < size ; i++){ //按照第一个字符串的长度循环,至于长度问题看下面if
char c = strs[0].charAt(i); //逐个取出第一个字符串的字符
for(int j = 1 ; j < count ;j++){ //从下标1的字符串开始
if( i == strs[j].length() || strs[j].charAt(i) != c){
//如果i的长度 等于 该遍历字符的长度(说明该字符串已遍历完)||
//该字符串的i字符和第一个字符串的i字符不相等
return strs[0].substring(0, i); //一旦碰到不符合的就返回
}
}
}
return strs[0];
}
}