C++寻找无重复字符的最长子串(桶优化解决)(二)

图片: 图片链接: 点击链接.Alt
因为视频图片无法转载,所以详情就查看上面图片链接。
具体看代码解释:注意:桶内值得大小表示了相应字符在字符串中的位置

class Solution
{
public:
    int lengthOfLongestSubstring(string s)
    {
        int start(0),end(0),length(0),res(0);//分别定义起始指针,末尾指针,非重复子串大小,最大非重复子串大小
        int ss=s.size();
        vector<int> rec(128,-1);//设定一个桶,桶的大小刚好放下所有字母,
        //字母在桶中的位置对应的ASCII码,初始值均为-1,表示位置尚未出现
        while(end<ss){
            int asc=int(s[end]);//将字符转换成相应的ASCII码
            if(rec[asc]>=start){//最难得是这三行代码:
               start=rec[asc]+1; //我们rec中存储的是位置,那么当读到一个元素在rec中非-1表示他在之前出现过,
               length=end-start;//若是大于start即头字符位置表示他在start后面出现过,也就是重复了,
                                //那么头字符串直接移到重复字符串后面一位,重新确定非重复字符串及其长度
            }
            rec[asc]=end;//在桶中更新尾字符的位置
            length++;//更新长度
            end++;//更新尾指针
            res=max(length,res);//更新最大长度
        }
        return res;
    }
};

这个写法相当的妙,且省时间,原因在于他如果发现了重复的字符串,则会直接跳到重复字符后面一位进行新的非重复字符串长度确定而不用一位一位遍历确定前面在哪一位重复了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值