滑动窗口
滑动窗口的思路非常简单
就是维护一个窗口
不断滑动
然后更新答案
滑动窗口的骨架
1 | public void slidingWindow(String s1, String s2) { |
看完了骨架,直接上四个题目
最小覆盖子串
1、我们先初始化 left = right = 0
,把索引区间 [left, right)
中的内容称为窗口。
2、不断地增加 right
指针扩大窗口 [left, right)
,直到窗口中的字符串符合要求(即窗口中的内容包含了 t
中的所有字符)。
3、此时,我们停止增加 right
,开始不断增加 left
指针缩小窗口 [left, right)
,直到窗口中的字符串不再符合要求。同时,每次增加 left
,我们都要更新结果。
4、重复第 2 和第 3 步,直到 right
到达字符串 S
的尽头。
这时候left开始向右移动,直到window中的字符不满足target的字符,即valid不等于needs的size()
这时候left开始向右移动,直到window中的字符不满足target的字符,即valid不等于needs的size()
这时候left开始向右移动,直到window中的字符不满足target的字符,即valid不等于needs的size()
代码:
1 | class Solution { |
字符串排序
1、先初始化left
和right
为0,把[left,right)
范围的数据叫做窗口
2、将需要符合的字符串条件初始化到needs中
3、不断扩大right
,使窗口逐渐变大
4、直到窗口长度等于s1的长度,如果这时候已经出现了符合条件的字符串直接返回true,反之,将left
向右走,缩小窗口
5、重复3、4,直到right
走到最后
1 | class Solution { |
找到字符串中所有字母异位词
其实本题就是上面那一题,只不过这一题需要将所有的异位词出现的地方都放到一个List中
代码:
1 | class Solution { |
无重复最长子串
1、初始化left
和right
为0,window作为窗口
2、将当前right
处的字符在window中的数目加一
3、如果当前right
处的字符在window中的数目已经大于1了。说明有了重复元素,需要将left
不断左移,直到当前right
处的字符在window中的数目不大于1
4、重复2、3操作
代码:
1 | class Solution { |