滑动窗口
总领
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。
浙公网安备 33010602011771号