https://leetcode-cn.com/problems/longest-common-prefix/
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入: ["flower","flow","flight"]
输出: "fl"
1.暴力解法
求的是前缀,依次暴力匹配。直到不符合
public String longestCommonPrefix(String[] strs) {
if(strs.length==0) return "";
String prefix=strs[0];
for(int i=1;i<strs.length;i++){
while(strs[i].indexOf(prefix)!=0){
prefix=prefix.substring(0,prefix.length()-1);
if(prefix.isEmpty()) return "";
}
}
return prefix;
}
2.分治
不断拆分成子问题,类似归并排序
public String longestCommonPrefix(String[] strs) {
if(strs==null || strs.length==0) return "";
return longestCommonPrefix(strs,0,strs.length-1);
}
public String longestCommonPrefix(String[] strs,int l,int r){
if(l==r){
return strs[l];
}else{
int mid=l+(r-l)/2;
String left=longestCommonPrefix(strs,l,mid);
String right=longestCommonPrefix(strs,mid+1,r);
return merge(left,right);
}
}
public String merge(String left,String right){
int min=Math.min(left.length(),right.length());
for(int i=0;i<min;i++){
if(left.charAt(i)!=right.charAt(i)){
return left.substring(0,i);
}
}
return left.substring(0,min);
}
3. 二分查找
主要思路
1.找到数组中最短的字符串,记为s
2.取一半,如果是公共前缀,则mid+1。否则mid-1
3.细节点在于最后的处理,返回的是[0,(right+left)/2]
public String longestCommonPrefix(String[] strs) {
if(strs==null || strs.length==0) return "";
int minLen=Integer.MAX_VALUE;
for(String str:strs){
minLen=Math.min(minLen,str.length());
}
int left=1;
int right=minLen;
while(left<=right){
int mid=(right+left)/2;
if(check(strs,mid)){
left=mid+1;
}else{
right=mid-1;
}
}
return strs[0].substring(0,(left+right)/2);
}
public boolean check(String[] strs,int index){
String match=strs[0].substring(0,index);
for(int i=1;i<strs.length;i++){
if(strs[i].indexOf(match)!=0){
return false;
}
}
return true;
}