什么是滑动窗口?#
滑动窗口,致力于解决数组、字符串中的连续子串相关的问题,通过左右指针框住一个窗口,维护窗口中的相关数值,每个元素最多被访问两遍,因此时间复杂度能从 降低到
使用情形#
滑动窗口,常用来在 O(N) 时间复杂度上处理子串相关的问题,常见有一下三种情形:
1. 固定长度的窗口#
首先框住第一个固定长度的窗口,再通过同时移动左右指针来移动窗口,每次移动会导致最左侧元素被删除、最右侧元素被加入,然后再根据变化维护窗口内的数值
以求固定长度区间最大值为例:

2 . 可变长度的窗口#
与上一个不同的是,我们可以扩大窗口,那么我们就可以单独右移右指针,以扩大窗口,举个例子来看吧:
比方说我们想在一个字符串中,找到最大长度的一个子串,保证这个子串中的字符不重复,那么就要用到滑动窗口了:

例题#
咱们以无重复字符的最长子串 ↗来举例子:
这道题实际上也就是上面所说的第二种情况,可以以 的时间复杂度来解决问题
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n=s.size(),ans=0;
unordered_set<char> Set;
int r=-1;
for(int i=0;i<n;i++) {
if(i!=0) {
Set.erase(s[i-1]);
}
while(r<n-1&&!Set.count(s[r+1])) {
Set.insert(s[r+1]);
r++;
}
ans=max(ans,r-i+1);
}
return ans;
}
};cpp