目录
1.题目解析
题目:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:strs = ["flower","flow","flight"]
输出:"fl"
此题其实也很简单(毕竟都是简单题),以第一个单词为原点,剩下的单词一位一位与第一个单词比对即可
2.代码提交
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0) return ""; //如果数组为空,那就没有比较的必要啦,直接return
int frs = strs[0].size();
int strsNums = strs.size();
for(int i=0;i<frs;i++)
{
int tmp = strs[0][i]; //这是第一个单词的temp,剩下的单词与它做对比
for(int j=1;j<strsNums;j++)
{
if((i == strs[j].size()) || (strs[j][i] != tmp))
return strs[0].substr(0,i); //substr是一个知识点,悄悄问对象才知道的!
}
}
return strs[0];
}
};
最后通过啦!
官方的题解有很多,挑几种学习一下。
第一种
第一个单词和第二个单词的公共前缀留下,然后与第三个单词的公共前缀对比,以此类推。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if(strs.size() == 0) return "";
string prefix = strs[0];
int strsNum = strs.size();
for(int i=0;i<strsNum;i++)
{
prefix = longestCommonPrefix(prefix,strs[i]);
if(!prefix.size())
{
break;
}
}
return prefix;
}
string longestCommonPrefix(const string &str1,const string &str2)
{
int length = min(str1.size(),str2.size());
int inx = 0;
while((inx<length) && (str1[inx] == str2[inx])) //一位位对比
{
inx++;
}
return str1.substr(0,inx);
}
};
第二种
看了一下觉得咱也是不太可能用这种方法,稍微有点点绕了,这里就直接贴官方代码啦!
先将strs分成两个部分,第一个部分内自己做对比,留下共同部分,第二个部分同理,然后两个部分再一起作比较即可。
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (!strs.size()) {
return "";
}
else {
return longestCommonPrefix(strs, 0, strs.size() - 1);
}
}
string longestCommonPrefix(const vector<string>& strs, int start, int end) {
if (start == end) {
return strs[start]; //为空直接return
}
else {
int mid = (start + end) / 2;
//分成两个部分
string lcpLeft = longestCommonPrefix(strs, start, mid);
string lcpRight = longestCommonPrefix(strs, mid + 1, end);
return commonPrefix(lcpLeft, lcpRight);
}
}
string commonPrefix(const string& lcpLeft, const string& lcpRight) {
int minLength = min(lcpLeft.size(), lcpRight.size());
for (int i = 0; i < minLength; ++i) {
if (lcpLeft[i] != lcpRight[i]) {
return lcpLeft.substr(0, i);
}
}
return lcpLeft.substr(0, minLength);
}
};
3.知识点学习
string s = "flower";
string str1 = s.substr(2); //表示从下标2开始一直到结尾:str1 = "ower"
string str2 = s.substr(1,3); //表示从下标2开始截取长度为3位:str2 = "low"