输入: ["flower","flow","flight"]
输出: "fl"
思路1:横向比较
LCP(s1,s2,..sn) = LCP(LCP(LCP(s1,s2),s3)….sn);
将每个字符一一比较得到当前最长前缀,如果当前最长前缀为空,则循环停止,时间复杂度O(mn),空间复杂度O(1);
外循环是数组{
内循环是比较
}
思路2:纵向比较
思路3:分治算法
分治模版:
masterfun(数组){
return masterfun(数组,0,数组长度-1);
}
masterfun(数组,start,end){
if(start ==end )return 数组[start];
else{
int mid =(end -start)/2+start;
左分支:masterfun(数组,0,mid);
有分支:masterfun(数组,mid+1,end);
合并: subfun(左分支,右分支);
}
}
subfun(左分支,右分支)
class Solution {
//横向扫描
// public String longestCommonPrefix(String[] strs) {
// if(strs.length==0) return "" ;
// if(strs.length==1) return strs[0];
// String prefix = strs[0];
// for(int i=1;i<strs.length;i++){
// String temp ="";
// for(int j=0;j<prefix.length()&& j<strs[i].length();j++){
// if(strs[i].charAt(j)==prefix.charAt(j)){
// temp+=strs[i].charAt(j);
// }else{
// break;
// }
// }
// prefix = temp;
// }
// return prefix;
// }
//纵向扫描
// public String longestCommonPrefix(String[] strs) {
// if(strs==null||strs.length==0) return "";
// String prefix = strs[0];
// for(int i=0;i<prefix.length();i++){
// for(int j=1;j<strs.length;j++){
// if(i==strs[j].length() || prefix.charAt(i)!= strs[j].charAt(i)){
// return prefix.substring(0,i);
// }
// }
// }
// return prefix;
// }
//分治算法
public String longestCommonPrefix(String[] strs) {
if(strs==null || strs.length ==0) return "";
return longestCommonPrefix(strs,0,strs.length-1);
}
private String longestCommonPrefix(String[] strs,int start,int end){
if(start==end) return strs[start];
else{
int mid = (end-start)/2+start;
String leftPre = longestCommonPrefix(strs,start,mid);
String rightPre = longestCommonPrefix(strs,mid+1,end);
return commonPre(leftPre,rightPre);
}
}
private String commonPre(String left,String right){
int len = Math.min(left.length(),right.length());
int count =0;
for(int i=0;i<len;i++){
if(left.charAt(i)!=right.charAt(i)){
return left.substring(0,i);
}
}
return left.substring(0,len);
}
}