无重复字符的最长子串

这道题使用滑动窗口。快指针写在 for 循环里,i++ 负责向前跑,慢指针写在 for 里面的 while 循环,只要满足一定条件,j++。

使用一个 map 维护当前滑动窗口内部的元素和它出现的次数。向前移动 i 指针,如果 [j, i] 窗口中有重复的元素,向前移动 j 直到窗口中没有重复的元素。窗口长度变化时记录窗口长度的最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> mp;
int res = 0;
for (int i = 0, j = 0; i < s.size(); i++) {
mp[s[i]]++;
while (mp[s[i]] > 1) {
mp[s[j++]]--;
}
res = max(res, i - j + 1);
}
return res;
}
};