题目描述:
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
解题思路:
对于可变窗口,我们同样固定初始化左右指针 l 和 r,分别表示的窗口的左右顶点。后面有所不同,我们需要保证:
- l 和 r 都初始化为 0
- r 指针移动一步
- 判断窗口内的连续元素是否满足题目限定的条件
如果满足,再判断是否需要更新最优解,如果需要则更新最优解。并尝试通过移动 l 指针缩小窗口大小。循环执行 4.1
如果不满足,则继续。 - 形象地来看的话,就是 r 指针不停向右移动,l 指针仅仅在窗口满足条件之后才会移动,起到窗口收缩的效果。
代码:
from collections import Counter
from collections import defaultdict
class Solution:
def minWindow(self, s: str, t: str) -> str:
l = 0
ans = s + s
n = len(s)
target = Counter(t)
counter = defaultdict(lambda: 0)
def contains(counter, target):
if len(counter) < len(target):
return False
for k in counter:
if k not in target or counter[k] < target[k]:
return False
return True
for r in range(n):
if s[r] in target:
counter[s[r]] += 1
while l < n and contains(counter, target):
if r - l + 1 < len(ans):
ans = s[l:r + 1]
if s[l] in target:
counter[s[l]] -= 1
l += 1
return "" if ans == s + s else ans
参考链接:
题目来源: