题目:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
Tag:
String; Hash Table; Two Pointers
体会:
这道题对我来说挺难,看了很多答案,还是不太会。。。现在也只是知道了个大概意思。
大致的意思就是,首先我们要有一个Map, 其中<Key, Value>=<char, char在string s 中最后一次出现的位置>。然后开始逐个检查string中的char。
假设string s = "cxyzabdecb", 现在我们的substring是"abd",那么有两种情况我们可以直接增加当前substring的长度,一个是现在的char是第一次出现,(比如出现了e,那么就可以变成abde);另一个是虽然这个char在先前出现过,但是并没有在当前substring中出现过,比如abde后面的那个c, 判断条件是 map[s[i]] < i - curLen,意思就是前面那个c出现在abdec这个范围之外。综上,两种情况的共同特点都是char要在当前的substring中没有出现过。
除了上面两种情况,那么就是char在现在的substring中出现过了,那我们的substring就只能保留后来的这个部分了,即从上一次这个char后面的那一位到当前位置。例子:abdec现在往后检查遇到了b,为了能把b加进来,就只能保留dec,变成decb了。
1 class Solution { 2 public: 3 int lengthOfLongestSubstring(string s) { 4 // map<char, last index that char appears in the string 5 map<char, int> indexes; 6 // length of current substring 7 int curLen = 0; 8 // length of max substring length so far 9 int maxLen = 0; 10 int n = s.length(); 11 12 for (int i = 0; i < n; i++) { 13 char ch = s[i]; 14 // if this char appears the first time or 15 // is not part of the current substring 16 if ((indexes.count(s[i]) == 0) || 17 (curLen < i - indexes[s[i]])) { 18 curLen++; 19 } else { 20 curLen = (i - indexes[s[i]]); 21 } 22 // update 23 indexes[s[i]] = i; 24 maxLen = (curLen > maxLen) ? curLen : maxLen; 25 } 26 return maxLen; 27 } 28 };