最长公共前缀
一 题目
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
二 题解
使用strs[0]当对照组,依次遍历后续的字符串,使用StringBuilder来记录结果。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){
return "";
}else if(strs.length==1){
return strs[0];
}else{
StringBuilder result = new StringBuilder();
Boolean finish = false;
for(int i=0;i<strs[0].length();i++){
if(finish){
break;
}
int j;
for(j=1;j<strs.length;j++){
if(strs[j].length()-1<i){
finish=true;
break;
}else if(strs[0].charAt(i)!=strs[j].charAt(i)){
finish=true;
break;
}
}
if(j== strs.length){
result.append(strs[0].charAt(i));
}
}
return result.toString();
}
}
}
三 优化
我们可以使用分治算法来计算字符串的最长前缀。分治算法的思想是当一个问题规模大且不易求解时,可以考虑将问题分成几个小模块,逐一解决。
如图所示,求一个字符串数组的最长前缀,可以将字符串数组分割成一个个小字符串,再求小字符串之间的最长前缀,一直合并,最终得到字符串数组的最长前缀。
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length==0){
return "";
}else if(strs.length==1){
return strs[0];
}else{
return LCP(strs,0, strs.length-1);
}
}
private String getLongestCommon(String str1,String str2){
int len = Math.min(str1.length(),str2.length());
int index=0;
while (index<len && str1.charAt(index)==str2.charAt(index)){
index++;
}
return str1.substring(0,index);
}
private String LCP(String[] strs,int left,int right){
if(left==right){
return strs[left];
}
int mid = (left + right)/2;
String leftString = LCP(strs,left,mid);
String rightString = LCP(strs,mid+1,right);
return getLongestCommon(leftString,rightString);
}
}