滑动窗口模板
适用情景:字符串或数组的子串或子数组
模板
def slidingWindow(s, t):
need = {} # 存储字符串 t 中各个字符的需求量
window = {} # 存储滑动窗口中各个字符的出现次数
for c in t: # 遍历字符串t
need.setdefault(c, 0) # 访问不存在的键时自动创建并将值设置为 0
need[c] += 1 # 统计字符串 t 中各个字符的需求量
left = 0 # 滑动窗口的左指针
right = 0 # 滑动窗口的右指针
valid = 0 # 记录满足需求的字符数
while right < len(s):
c = s[right]#c 是将移入窗口的字符
right += 1#右移窗口
# 进行窗口内数据的一系列更新
#......
# debug 输出的位置
# print("window: [{}, {})".format(left, right))
# 判断左侧窗口是否要收缩
while (window needs shrink):
d = s[left]#d 是将移出窗口的字符
left += 1#左移窗口
# 进行窗口内数据的一系列更新
#......
套模板需思考问题
- 当移动right扩大窗口,即加入字符时,应该更新哪些数据?
- 什么条件下,窗口应该暂停扩大,开始移动left缩小窗口?
- 当移动left缩小窗口,即移出字符时,应该更新哪些数据?
- 我们要的结果应该在扩大窗口时还是缩小窗口时更新?