输入: ["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);}}
