滑动窗口

总领

Object window = ...
int left = 0, right = 0;
while (right < s.length()) {

char c = s[right];
window.add(c)
...
right++;

while (left < right && window needs shrink) {
char d = s[left];
window.remove(d)
...
left++;

}
}
框架中两处 ... 表示的更新窗口数据的地方,而且,这两个 ... 处的操作分别是扩大和缩小窗口的更新操作,是完全对称的。

基于这个框架,遇到子串/子数组相关的题目:

1、什么时候应该移动 right 扩大窗口?窗口加入字符时,应该更新哪些数据?

2、什么时候窗口应该暂停扩大,开始移动 left 缩小窗口?从窗口移出字符时,应该更新哪些数据?

3、什么时候应该更新结果?

最小覆盖字串

https://leetcode.cn/problems/minimum-window-substring/
完美契合上述模板,...处写更新窗口代码,扩大窗口时先更新再判断,缩小窗口时先判断再更新。start和len记录答案。

字符串的排列

https://leetcode.cn/problems/permutation-in-string/description/
我的发,我还是没有注意一点。做题之前应该先问自己三步走:什么时候扩张?扩张的时候要做什么?什么时候缩小?缩小的时候要干什么?
盲目抄模板但是忘了三步走,这题两个字符连在一起才能算是包含在另一个字串“暗示”缩小的条件是s1的长度啊!!!!

找到字符串中所有的字母异位词

https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/
ok这题快速解决,这次注意了,写对了。

无重复字符的最长字串

https://leetcode.cn/problems/longest-substring-without-repeating-characters/
给输入两个字符串的会写了,给一个字符串问最长不会了,错在不会变通,其实思路是一样的,什么时候扩展?扩展时候要做什么?什么时候缩小?缩小的时候要做什么?
滑动窗口维护了一个无重复字符的字串,每次第二个while循环结束时更新最长的res。

posted @ 2026-07-01 21:17  柳成荫y  阅读(5)  评论(0)    收藏  举报