3 Longest Substring Without Repeating Characters
一开始没有理解题目,卡了好久。题目大意就是要找一个字符的最长子串,这个子串自身不能包含任何重复字符。
例子:”abcabcbb” is “abc”, “bbbbb” is “b”
如果考虑最简单的两重循环的话肯定超时= =。使用哈希表存储每个字符出现的位置m[i],开始指针startP指向0,然后用for(i)遍历字符串,子串长度就等于i - startP + 1,如果发现出现了重复字符,那么开始指针startP就等于存储位置的下一个:m[i] + 1,继续遍历检查是否大于当前最大子串长度,直至结束。
提交之后WA了两次,有两个细节没注意到:第一个是每次遍历到当前字符的时候,先检查哈希表有木有再插入,我当时是先插入了再检查的有木有(真傻了这还检查个毛= =)。第二个是如果字符重复,重复字符在当前遍历位置之前,那么startP不变,不用等于m[i] + 1(例子“abba”)。
最后AC代码如下:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map <char, int> m;
int startP = 0;
int max = 0;
for (int i = 0; i < s.size(); i++)
{
if (m.count(s[i]))
{
if (m[s[i]] + 1 > startP)
{
startP = m[s[i]] + 1;
}
m[s[i]] = i;
}
else
{
m.insert(pair<char,int>(s[i], i));
}
if (i - startP + 1 > max)
{
max = i - startP + 1;
}
}
return max;
}
};