题意
找各个字符都不同的最长子串。
题解
使用STL自带的hash容器map。枚举每个起始位置开始的子串需要O(n^2),会超时。使用尺取法在O(n)时间内解决。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.length();
if (len == 1)
return 1;
int maxlen = 0;
int i = 0;
int j = i + 1;
map<char, int> dict; // means (character : postion)
dict[s[i]] = i;
map<char, int>::iterator eit = dict.end();
while (i < len)
{
while (j < len && dict.find(s[j]) == eit ) // find a character that has been in substring
{
dict[s[j]] = j; //not found
j++;
}
if (j == len)
{
maxlen = max(maxlen, j - i);
break;
}
else
{
maxlen = max(maxlen, j - i);
int nexti = dict[s[j]]; // old pos of s[j]
while (i <= nexti) // update dict: delete ele from i to nexti
dict.erase(s[i++]); // or implicit delete: dict[s[i++]] = -1;
dict[s[j]] = j; // update s[j] into new pos
j++;
}
}
return maxlen;
}
};