用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_map
和map
类似,都是存储的key-value
的值,可以通过key
快速索引到value
。不同的是unordered_map
不会根据key
的大小进行排序,存储时是根据key
的hash
值判断元素是否相同,即unordered_map
内部元素是无序的。unordered_map
的key
需要定义hash_value
函数并且重载operator==
。