前言
- 文章作为日记或心得,记录学习过程
- 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
- 如对内容有任何建议或看法,欢迎评论区学习交流
正文
题目
有两种想法,一种是比较每个字符串中的第一个字符,若相同,则比较第二个,若不同,则返回
第二种是,每次比较两个字符串,取其最长公共前缀,再用新的字符串和下一个比较。
后来根据官方答案得知,第一种方法叫纵向扫描,第二种叫横向扫描
解答:纵向扫描
官方答案扒的图,它自己有力扣的水印,后面就不再说明了
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int count = strs.size();
string common = "";
for (size_t i = 0; i < strs[0].size(); i++)
{
for (size_t j = 1; j < count; j++)
{
//对于每个字符串的第i个字符,判断全相同转为如果不相同就结束
if (strs[0][i]!=strs[j][i])
return strs[0].substr(0, i);
}
}
return common;
}
};
也就是没有考虑空strs的情况,补上判断条件后
补上判断是否只有一个字符串后
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
int count = strs.size();
string common = "";
if (count == 0)
return common;
if (count == 1)
return strs[0];
for (size_t i = 0; i < strs[0].size(); i++)
{
for (size_t j = 1; j < count; j++)
{
//对于每个字符串的第i个字符,判断全相同转为如果不相同就结束
if (strs[0][i] != strs[j][i])
return strs[0].substr(0, i);
}
//如果能出上面循环,则说明strs[0][i]为公共字符
common = common + strs[0][i];
}
return common;
}
};
结果
解答:横向扫描
class Solution {
public:
//先写个函数,可以取两字符串的公共
string lcp(string str1, string str2)
{
string common = "";
for (size_t i = 0; i < str1.size(); i++)
{
if (str1[i] == str2[i])
common = common + str1[i];
}
return common;
};
string longestCommonPrefix(vector<string>& strs) {
int count = strs.size();
if (count == 0)
return "";
if (count == 1)
return strs[0];
string temp = lcp(strs[0], strs[1]);
for (size_t i = 2; i < strs.size(); i++)
temp = lcp(temp, strs[i]);
return temp;
}
};
应该是lcp写错了,取的是最后的a