滑动窗口本质上是对于暴力算法的优化,采用的是双指针算法中的左右指针,对于暴力算法的优化。
滑动窗口的基本模板
while(right
思考四个问题
1.移动right扩大窗口,即加入字符时,需要更新哪些数据
2.什么条件下,窗口应该暂停扩大,开始移动left缩小窗口
3.当移动left缩小窗口,即移出字符时,应该更新哪些数据
4.我们要的结果是在扩大窗口时还是在缩小窗口时更新
四个问题在滑动窗口的问题中都会出现,但是每个不同的题目,这四个问题的答案都是不同的,应该具体问题具体分析
1.最小覆盖子串
题目的要求:窗口中包含子串所有的字符,且数量一致
四个答案:
1.移动right扩大窗口,即加入字符时,需要更新哪些数据
移动right时,需要更新窗口中的数据(windows),当前已满足元素(valid)
2.什么条件下,窗口应该暂停扩大,开始移动left缩小窗口
窗口已经满足题目要求了,即valid==needs.size(),窗口已包含子串元素个数==子串元素总个数
3.当移动left缩小窗口,即移出字符时,应该更新哪些数据
移出字符时,应该判断窗口元素是否减小,减小了的话valid是否减小
4.我们要的结果是在扩大窗口时还是在缩小窗口时更新
缩小窗口,因为扩大窗口是让我们满足完全包含子串中的元素,缩小窗口是为了让我们找到满足要求的最小窗口
#include
#include
#include
2.字符串的排列
题目要求:窗口中仅包含子串中的元素且数量相同
#include
#include
#include
3.找字符串中所有字母的异位词
题目要求:窗口中仅包含子串中的元素且数量相同
#include
#include
#include
4.不含重复字母的最小子串
题目要求:窗口中不能有重复的字符,且窗口的长度要最大
#include
#include
#include