最长公共前缀:必须是从第一个开始算起,如果第一个都不一样,则返回空
最新思路:取第一个字符串为前缀,然后依次与剩下的字符串去比较依次得出最新的前缀,比如
前缀与第二个字符串比较得出的前缀,再去与第三个字符串比较得出最新的前缀。。。。。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int size = strs.size();
//判断有多少个字符串,0和1特殊处理
if(size==0) return string("");
else if(size==1) return strs[0];
//取第一个字符串为目前的前缀
string pre = strs[0];
//当前的前缀与后面的字符串依次去比较得出最新的前缀
for(int i=1;i<size;i++){
//如果当前字符串为空,则返回空字符串
if(strs[i].size()==0) return string("");
//获得前缀字符串和当前字符串的长度
int x = strs[i].size();
int y = pre.size();
//遍历两者的字符进行判断,如果不相等则截取下标为0到目前下标的字符串(不包含当前下标
for(int j = 0;j<min(x,y);j++){
if(strs[i][j]!=pre[j]) pre=pre.substr(0,j);
}
}
return pre;
}
};
思路一:从第一个与第二个开始求最长公共前缀,然后结果与第三个求最长公共前缀,如果中间遇到最长公共前缀没有,则跳出迭代,直接返回" "
代码如下:
class Solution {
public:
string longestCommonPrefix1(vector<string>& strs) {
if (!strs.size()) return "";
if(strs.size()==1) return strs[0];
//用来保存最长公共前缀
string prestr=strs[0];
int count=strs.size();
//进行遍历寻找每次的最长公共前缀
for(int i=1;i<count;i++){
prestr=longestCommonPrefix(prestr,strs[i]);
if(prestr==""){
return "";//遇到最长公共前缀为空则直接返回
}
}
return prestr;
}
//求2个字符串的最长公共前缀
string longestCommonPrefix(const string& str1, const string& str2) {
int length=min(str1.length(),str2.length());
int index=0;
while(index<length&&str1[index]==str2[index]){
index++;
}
return str1.substr(0,index);
}
};
思路二:分治思想,将整个字符串数组分成2块,再分成2块, 直到最小的两个单元进行求最长公共前缀
代码如下:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (!strs.size()) return "";
if(strs.size()==1) return strs[0];
int count=strs.size();
//进行分治求最长公共前缀
string prestr=merge_deal(strs,0,count-1);
return prestr;
}
//分治处理
string merge_deal(vector<string>& strs,int start,int end){
//分成了只剩一个字符串的字符串数组
if(start==end) return strs[start];
//分成了只剩两个个字符串的字符串数组
if(end-start==1) return longestCommonPrefix(strs[start],strs[end]);
int mid=(start+end)>>1;
//分治处理
return longestCommonPrefix(merge_deal(strs,start,mid),merge_deal(strs,mid+1,end));
}
//求2个字符串的最长公共前缀
string longestCommonPrefix(const string& str1, const string& str2) {
int length=min(str1.length(),str2.length());
int index=0;
while(index<length&&str1[index]==str2[index]){
index++;
}
return str1.substr(0,index);
}
};