看了官方解析
- 昨天迷迷糊糊中想到了set,结果更慢了,13ms 40M
- 横向对比(把第一个字符串当做LCP,逐对对比,更新LCP,直到遍历完所有字符串,或者LCP为空时结束)
- 纵向对比
Code
横向对比
1ms 37.8M
/**
* @Author:lixici
* @Date:2020/9/4 22:38
*/
public class LongestCommonPrefix3 {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
String prefix = strs[0];
for(int i=1;i<strs.length;i++){
prefix = commonPrefix(prefix,strs[i]);
if (prefix.length() == 0) {
break;
}
}
return prefix;
}
public String commonPrefix(String str1,String str2){
int length = Math.min(str1.length(),str2.length());
int i=0;
while(i<length && str1.charAt(i) == str2.charAt(i)){
i++;
}
return str1.substring(0,i);
}
public static void main(String[] args) {
LongestCommonPrefix3 lcp = new LongestCommonPrefix3();
String[] strs = {"a","b","c"};
System.out.println(lcp.longestCommonPrefix(strs));
// System.out.println(lcp.commonPrefix("abb","abc"));
}
}
纵向对比
2ms 37.8M
/**
* @Author:lixici
* @Date:2020/9/4 22:12
*/
public class LongestCommonPrefix4 {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0){
return "";
}
/*
遍历第一个字符串,用它的每一个字符,和后面其他字符串同位置的比较
*/
for(int i=0;i<strs[0].length();i++){
// i:每一列(列数不会超过第一个字符串的长度)
char c1 = strs[0].charAt(i);// 用第一行的每个字符和后面的行比较
for(int j=1;j<strs.length;j++){
// j:每一行(i列中的每一行)
if(i==strs[j].length() || strs[j].charAt(i)!=c1){
// 走到了这一行的结尾 || 这一行的第i列不等于第一行的第i列
return strs[0].substring(0,i);// 不包括下标i的字符
}
}
}
return strs[0];
}
public static void main(String[] args) {
LongestCommonPrefix4 lcp = new LongestCommonPrefix4();
String[] strs = {"a","aab","aac"};
System.out.println(lcp.longestCommonPrefix(strs));
// System.out.println(lcp.commonPrefix("abb","abc"));
}
}