2023-6-26-力扣-14-最长公共前缀 c++求解 以及关于里面使用的string.substr()函数科普

力扣14题公共前缀
题目才开始看错了,以为是求公共子缀,看到后来才发现是公共前缀,前缀!!!
此处用到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++;
    }

哦豁这个里面又用到了::这个作用符号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值