leetcode 3. Longest Substring Without Repeating Characters

用unordered_map存储字符和字符对应的索引。

left是上一个重复字符的位置索引,初始为-1,因为最开始没有重复字符,如果初始为0,就表示第0个位置重复了,显然不符合题意。同时你也可以用i-left计算发现,如果前面没有重复,你的left初始化为0,计算就少1了。

注意:if判断中要m[s[i]] > left,也就是说如果map中存储的对应索引小于left,就可以不更新left

比如a、b、b、a这种情况,如果没有m[s[i]] > left,输出的结果是3,这个时候i是3,left是0.因为unordered_map并没有删除之前的a,所以在最后一个a的时候会报错

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() <= 0)
            return 0;
        unordered_map<char,int> m;
        int left = -1,res = 0;
        for(int i = 0;i < s.size();i++){
            if(m.find(s[i]) != m.end() && m[s[i]] > left)
                left = m[s[i]];
            m[s[i]] = i;
            res = max(res,i - left);
        }
        return res;
    }
};

https://www.cnblogs.com/grandyang/p/4480780.html

unordered_mapmap类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序,存储时是根据keyhash值判断元素是否相同,即unordered_map内部元素是无序的。unordered_mapkey需要定义hash_value函数并且重载operator==

原文地址:https://www.cnblogs.com/ymjyqsx/p/9657652.html