一、介绍
1.题目描述
题目链接:https://leetcode-cn.com/problems/longest-common-prefix/
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
2.测试样例
["flower","flow","flight"] # "fl"
["dog","racecar","car"] # ""
二、题解
1、暴力(纵向扫描)🟢
依次判断每个字符串的第 i 个字符是否相同,直到不相同为止
- 遍历得到最小的字符长度,防止超限
# 1、新建空字符串,不断加入后返回
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int minn=201;
// 最短的字符有多长
for(int i=0;i<strs.size();i++){
if(minn>strs[i].length()) minn=strs[i].length();
}
// s 存储已确定的公共前缀
string s="";
// 当遍历到字符不一致,返回已确定公共的字符串
for(int i=0;i<minn;i++){
char t=strs[0][i];
for(int j=1;j<strs.size();j++){
if(strs[j][i]!=t) return s;
}
s+=strs[0][i];
}
return s;
}
};
# 2、用substr返回
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int minn=201;
for(int i=0;i<strs.size();i++){
if(minn>strs[i].length()) minn=strs[i].length();
}
for(int i=0;i<minn;i++){
char t=strs[0][i];
for(int j=1;j<strs.size();j++){
if(strs[j][i]!=t) return strs[0].substr(0,i);
}
}
return strs[0].substr(0,minn);
}
};
1、
2、
2、LCP(LCP(S1,S2),S3)..【横向扫描】🟡
判断第一个字符串s1和第二个字符串s2的公共前缀,作为新字符串 s' 和第三个字符串 s3 计算前缀。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
string pre=strs[0];
for(int i=1;i<strs.size();i++){
string temp="";
int n=min(pre.length(),strs[i].length());
for(int j=0;j<n;j++){
if(pre[j]!=strs[i][j]) break;
else temp+=pre[j];
}
if(temp.length()==0)return "";
if(temp.length()<pre.length()) pre=temp;
}
return pre;
}
};
3、分治法🟡
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) return "";
return midpre(strs,0,strs.size()-1);
}
// 两个字符串计算公共前缀
string Prefix(const string& str1,const string& str2) {
int n=min(str1.length(),str2.length());
int i=0;
for(;i<n;i++){
if(str1[i]!=str2[i]) return str1.substr(0, i);
}
return str1.substr(0, n);
}
// 递归直到只有两个字符串比较
string midpre(vector<string>& strs,int l,int r){
int mid=(l+r)/2;
if(l>=r) return strs[l];
else{
string str1=midpre(strs,l,mid);
string str2=midpre(strs,mid+1,r);
return Prefix(str1,str2);
}
}
};
4、排序后比较首尾🔴
- 由于字符大小按ASCⅡ数值排序,相同字符数值相同。
- 若有公共前缀,比较首尾必能得到
- 公共前缀长度一定小于首尾长度的最小值
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size()==0)return "";
sort(strs.begin(),strs.end());
string st=strs.front(),en=strs.back();
int n=min(st.size(),en.size());
for(int i=0;i<n;i++){
if(st[i]!=en[i])return st.substr(0,i);
}
return strs[0];
}
};