题解
思路
代码
class Solution:
### 0104 滑动窗口(92 ms,15.2 MB)
def minWindow(self, s: str, t: str) -> str:
# 初始化最短字符串长度为正无穷
min_len, res = float('+inf'), ''
# 初始化滑动窗口左、右边界均为0
l = r = 0
# 统计字符串t中目标字符的数量
cnt = len(t)
# 定义一个初始化为0的字典pos_neg(哈希表)
# pos_neg中为正的是目标字符,为负的是非目标字符
# 为0表示目标字符已被包含完
pos_neg = collections.defaultdict(int)
# 统计t中的字符数量cnt
for c in t:
pos_neg[c] += 1
# 当右边界不超过字符串s的最后一个字符,进行循环
while r < len(s):
# 滑动窗口右边界移动后,恢复目标字符和非目标字符的数量(减一)
# 判断当前右边界指向的字符是否为目标字符
# 若是则目标字符数量cnt减一
if pos_neg[s[r]] > 0:
cnt -= 1
pos_neg[s[r]] -= 1
# 右边界右移
r += 1
# 若目标字符已经被包含完,则尽可能缩减最小覆盖子串的长度
while cnt == 0:
# 若出现更短的覆盖子串,则更新最小覆盖子串
if min_len > r - l:
min_len = r - l
res = s[l: r]
# 滑动窗口左边界移动后,恢复目标字符和非目标字符的数量(加一)
# 判断当前左边界指向的字符是否是目标字符
if pos_neg[s[l]] == 0:
cnt += 1
pos_neg[s[l]] += 1
# 左边界右移
l += 1
return res