给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
class Solution:
def minWindow(self, s: 'str', t: 'str') -> 'str':
from collections import defaultdict
# 容器,利用默认字典的 key 值去重特性,保证存储的字符无重复
lookup = defaultdict(int)
# 左边界
start = 0
# 右边界
end = 0
# 信号,当子串中包含t中所有字符时 flag=0;否则 0<falg<=3
flag = len(t)
# 返回值
res = ""
# 初始化子串的最小长度为正无穷
min_len = float("inf")
# 初始化字符串t中的字符对应的 value 值均为1
for c in t:
lookup[c] += 1
while end < len(s):
# 1. 对字符串 t 的字符覆盖检测器
if lookup[s[end]] > 0:
flag -= 1
# 2. 在保证窗口内的 value 值均小于等于 0 的前提下,右边界不断向右移动
lookup[s[end]] -= 1
end += 1
# 3. flag=0,说明当前子串以完全覆盖 t 中的字符
while flag == 0:
# 3.2 保证始终是去取符合要求的最小长度的子串
if min_len > end - start:
min_len = end - start
res = s[start:end]
# 3.3 容器中 t 中字符对应的 value 值==0,检测到该类字符后,信号消失,获得当前 res
if lookup[s[start]] == 0:
flag += 1
# 3.1 左边界不断右移,并将 value 值复原
lookup[s[start]] += 1
start += 1
return res