编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,“flow”,“flight”]
输出: “fl”
思路一:
先找到数组中最短元素,最长公共子串不会超过最短元素
对第一个元素迭代分割,分割后的子串用于迭代比较是否相同。
class Solution {
public String longestCommonPrefix(String[] strs) {
String res="";
if(strs==null||strs.length==0){
return res;
}
if(strs.length==1){
return strs[0];
}
int min = strs[0].length();
for(int i=1;i<strs.length;i++) {
if(min>strs[i].length())
min=strs[i].length();
}
int i=1;
boolean flag = true;
for (i = 1; i <= min; i++) {
String tmp = strs[0].substring(0, i);
for (int j = 0; j < strs.length; j++) {
if (!tmp.equals(strs[j].substring(0, i))) {
flag = false;
break;
}
}
if (flag == false) {
if(i==1) {
return "";
}else {
return strs[0].substring(0, i - 1);
}
}
if (flag == true && i==min) {
return strs[0].substring(0, i);
}
}
return res;
}
}
思路二:水平扫描
最长公共前缀一定是任何两个字符串的公共前缀;
因此选取第一字符串作为参照字符串,与第二个字符串求最长前缀;
求得最长前缀,依次对剩下的字符串两两取公共子串;
例如[“flower”,“flow”,“flight”]
第一次比较LCP(1,2)=>“flow”;
第二次LCP(1,3) =>“fl”;
如果参照字符串为空则返回“”
public static String longestCommonPrefix(String[] strs) {
if (strs.length == 0)
return "";
String privo = strs[0];
int len = strs.length;
for (int i = 1; i < len; i++) {
while (strs[i].indexOf(privo) != 0) {
privo = privo.substring(0, privo.length() - 1);
if (privo.length() == 0)
return "";
}
}
return privo;
}
性能分析:遍历所有字符串的所有字符;
思路三: