【问题】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

示例 1:
输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

【思路】

首先我们现在看一下最简单的一个字符串的查找,比如"ydyw",首先左边界left=0,我们开始遍历,每遍历一个位置,如果没有重复的元素,那么max_len=i-left+1,然后对max_len进行更新!如果找到一个重复的元素,比如遍历到i=2,此时y重复,那么我们要更新左边界的索引为上一次该元素索引值+1,这样就保证了此时[left:i]即[1:2]中没有元素重复!

由于我们需要使用上一次遍历的索引值,因此我们使用hashmap来进行存储,我们可以使用"边遍历边建立hashmap"的思想!

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0, max_len = 0;
        unordered_map<char, int> hashmap;
        for(int i = 0;i < s.size(); i++){  
            if(hashmap.find(s[i]) != hashmap.end()){
                left = max(left, hashmap[s[i]]+1);
                // 如果找到了,左边界更新为上一个遍历该元素索引值+1
            }
            max_len = max(max_len, i-left+1);
            hashmap[s[i]] = i;
        }
        return max_len;
    }
};