本题要求如下:
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.
这题看似简单,其实也不难,只不过我开始走到了一个陷阱里面,得出了错误的答案,
比如给出的例子: abcabcbb,我开始的算法是:
1,设一个hashmap,如果找不到s[i],则将其插入hashmap,然后检测下一个i
2,如果找到hashmap里面有s[i],则将hashmap清空,然后重新开始,但是此时要记录下hashmap的size()与count比较,如果大于count,这个作为count。
但是这个算法有一个漏洞:比如"abcdbaf",按我的算法就是检测完abcd,发现下一个元素b在还是hashmap中出现过,所以清空hashmap,从这个b继续开始检测,这样得到的count就是4,但其实这道题是5:"cdbaf"
所以正确算法,设定一个left,是如果检测到元素"b",应该把left到“b”之前的元素从hashmap中删除,但是别的元素保留,且将left移动到"c"的位置。
代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int right = 0;
int left = 0;
int count = 0;
map<char, bool> character;
map<char, bool>::iterator it;
while (right < s.size()) {
it = character.find(s[right]);
count = max(count, right-left);
if (it != character.end()) {
while (s[left] != s[right]) {
character.erase(s[left]);
++left;
}
++left;
++right;
}
else {
character[s[right]] = true;
++right;
}
}
count = max(count, right-left);
return count;
}
};