给k个字符串,求出他们的最长公共前缀(LCP)
样例
在 "ABCD" "ABEF" 和 "ACEF" 中, LCP 为 "A"
在 "ABCDEFG", "ABCEFG", "ABCEFA" 中, LCP 为 "ABC"
解题思路1:
两两比较得出临时前缀结果,再用这个结果去比较下一个字符串得出又一个前缀结果,直到比较完所有字符串,这个前缀结果即为最终结果。
public class Solution {
/**
* @param strs: A list of strings
* @return: The longest common prefix
*/
public String longestCommonPrefix(String[] strs) {
StringBuilder sb = new StringBuilder();
int p = 0; //指向字符串中的字符位置
int times = 0; //当前字符存在于多少str中
Character c = null; //strs[i].charAt(p)
for(int i=0; i<strs.length && p<strs[i].length(); i++){
if(i == 0){ //首字符
c = strs[i].charAt(p);
times++;
}else if(c == strs[i].charAt(p)) //相等则继续遍历
times++;
else //不等则退出
break;
if(times == strs.length){ //若相同字符次数==strs长度,表明为公共前缀
sb.append(c);
times = 0;
p++;
i = -1;
}
}
return sb.toString();
}
}
解题思路2:
以第一个字符串为参照,固定列,逐行对比,找出最大前缀。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs == null || strs.length == 0)
return "";
int length = strs[0].length(); //列
int wide = strs.length; //行
for(int i=0; i<length; i++){
char c = strs[0].charAt(i);
for(int j=1; j<wide; j++){
if(i >= strs[j].length() || strs[j].charAt(i) != c)
return strs[0].substring(0, i);
}
}
return strs[0];
}
}