leetcode:最长不重复子串hash表解法

leetcode 最长不重复子串:

利用hash表解决:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int begin(0), end(0);
        int sSize = int(s.size());
        int len=0;
        int maxLen = 0;
        unordered_map<char,int> hash;
        while(end<sSize)
        {
            char tempChar = s[end];
            if(hash.find(tempChar)!=hash.end()&&hash[tempChar]>=begin)
            {
                begin = hash[tempChar]+1;
                len = end-begin;              
            }

            hash[tempChar]=end;
            end++;
            len++;
            maxLen = max(len,maxLen);
        }

        return maxLen;
    }
};

第一次没搞懂就在于没看懂这个if判定;

下面来梳理一下逻辑:

每次都设tempChar为字符串下一个待判定的字符:

如果字符串所有字符都是不一样的,那么我们会得到:

hash[tempChar]=end; 即hash表中每一个字符key都按照其位置得到了一个value(0,1,2,3…

最长子串长maxLen就是字符串长

但是因为有重复,所以要判定:这个if判定有两个作用:

  1. ​ hash.find(tempChar)!=hash.end()

    确定当前值在hash表内;如果不在的话,hash.find会返回hash.end

    1. hash[tempChar]>=begin

    因为hash[tempChar]还没有更新,所以其所指向的是上一个相同值在字符串中的位置,需要让这个位置在begin的右侧。

    如果这个值已经在begin的左侧,也就是没有被包进来,那么表示意思就是不在当前窗口内,不需要管它。只需要管好窗口内的值就好了。

如果两个条件都满足,那么进入判定内,更新begin位置,将begin右移一位,hash表中char的value就是该char字符在字符串中的位置

因为:🐸

	tempChar = s[end];

	hash[tempChar]=end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值