题目才开始看错了,以为是求公共子缀,看到后来才发现是公共前缀,前缀!!!
此处用到string.substr(0,size)截取子串的函数,截取当前string的前size个字符,不包括第size个
然后菜鸡代码,菜鸡到流泪,菜鸡到无边无际,菜鸡到无能狂怒
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
//先找出数组里最短的字符串,因为公共子前缀的最长长度不超过数组中最短的字符串长度
string shortest=strs[0];
for(auto i:strs)
{
if(i.size()<shortest.size())
{
shortest=i;
}
}
//找到最短字符串以后 判空 如果最短字符串为空,则返回空
if(shortest!="")
{
string prefix;
for(int size=1;size<=shortest.size();++size)
{
prefix=shortest.substr(0,size);
for(auto i:strs)//遍历字符串中的数组
{
if(prefix==i.substr(0,size))
//因为题目只要求找公共前缀,前缀前缀,所以都从(0,size)截取
{
continue;
}
else//如果不符合,就表示当前这个不符合,返回之前的
{
return shortest.substr(0,size-1);
}
}
}
return prefix;
}
return "";
}
};
中间还出现了一个小问题,在判断for循环中size的临界条件的时候,size没有取等shortest.size,导致如果字符串如果最后一个是匹配的,但因为size没有和shorttest最短字符串的size取等号,所以最后一个未能截取得上。
思路:先判空,空就返回空,不空就截取,size++,再截取,直到下一个不符合,直接返回,如果一直符合,那就符合完了最后再返回。
当然这个思路非常菜
挺不容易的,这个复杂度,神看了都要流泪,学计算机真是为难我了。
让我去参谋参谋别人的想法去,去看标准答案了
以下是标准答案:
class Solution {
public:
string longestCommonPrefix(vector<string>& strs) {
if (strs.empty())
{
return "";
}
string s = strs[0];//
int len = s.length();
for(int i = 1; i < strs.size(); ++i)
{
while (strs[i].find(s) != 0)
//判断位置 返回位置不为0 表示这个子串不是从最前面开始的公共前缀子串
//那就减少子串含有字符个数len-- 继续判断这个s是不是公共子前缀
//临界条件:直到找到一串字符串 既满足所有字符串里面都有 也满足 find(S)=0 即str[i].find(s)=0
{
s = s.substr(0, len - 1);//就截取当前长度减1的字符串
len--;
if(len == 0)
{
return "";
}
}
}
return s;
}
};
用到了string.find(str)函数,科普一下
//找到目标字符的位置
string s = "hello world!";
cout << s.find("e") << endl;
输出结果:1
返回值为目标字符的位置(第一个字符位置为0),当没有找到目标字符时返回npos
//指定查找位置
string s = "hello world!";
cout << s.find("l",5) << endl;
输出结果:9
从第六个字符开始查找字符“l”的位置,返回位置9
延伸用法: 找到目标字符第一次出现和最后一次出现的位置
string s = "hello world!";
cout <<s.find_first_of("l") << endl;//第一次出现的位置
cout << s.find_last_of("l") << endl;//最后一次出现的位置
结果为:9
通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。
查找所有子串在母串中出现的位置
//查找s 中flag 出现的所有位置。
string s("hello world!");
string flag="l";
int position=0;
int i=1;
while((position=s.find(flag,position))!=string::npos)
{
cout<<"position "<<i<<" : "<<position<<endl;
position++;
i++;
}
哦豁这个里面又用到了::这个作用符号