力扣:3. 无重复字符的最长子串(滑动窗口)
·
思路:
1.定义一个右指针right= 一1,且right只遍历字符串一次
2.定义set集合,定义外层for循环,for循环的 i 就相当于左指针(左右指针之间就是一个窗口)
3.内层while循环,只要右边的字符在set集合没有出现过,就继续while循环(右指针right右移),扩大窗口
4.更新Max
注意:for循环里面要先把 i 左边的字符从set集合移除,因为每循环一次,i会加1(左指针右移),缩小窗口
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// set集合,记录每个字符是否出现过
unordered_set<char> set;
int n = s.size();
// 右指针,初始值为 -1,相当于在字符串的左边界的左侧
int right = -1, Max = 0;
for (int i = 0; i < n; i++) {
if (i != 0) {
// 左指针向右移动一格(就是for循环的i++),把左指针指向的字符从set集合移除
set.erase(s[i - 1]);
}
// 如果不越界且右边字符不在set里面,就移动右指针
while (right + 1 < n && !set.count(s[right + 1])) {
set.insert(s[right + 1]);
right++;
}
//更新Max
Max = max(Max, right - i + 1);
}
return Max;
}
};
更多推荐
所有评论(0)