问题描述
给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
问题思考:
要解决这个问题,要用到滑动窗口的知识————就是先在S中找到一个窗口,该窗口包含字符串T,然后更新窗口、移动窗口,每次操作时,更新最小窗口长度和子串。
具体步骤请看下面的注释:
class Solution:
def minWindow(self, s: str, t: str) -> str:
from collections import defaultdict
lookup = defaultdict(int) #构造一个字典
for c in t:
lookup[c] += 1 #该字典存储t中的字母:次数
start = 0
end = 0
min_len = float("inf")
counter = len(t)
res = ""
while end < len(s): #遍历s
if lookup[s[end]] > 0: #如果该字母在t中
counter -= 1 #将该字母取出
lookup[s[end]] -= 1 #对应位置减一
end += 1 #末尾位置后移
while counter == 0: #当t中的字符已经全部包含
if min_len > end - start: #保存start:end的字符串
min_len = end - start
res = s[start:end]
if lookup[s[start]] == 0: #如果lookup[s[start]]是0,说明该位置字母是t中的某个字符,因为如果不是则是-1
counter += 1 #将该字母放进 lookup中
lookup[s[start]] += 1 #对应位置减一
#如果初始位置是t中的字符,继续第一个while循环,寻找到可以替代该字符的位置,如果长度更小,更新res
#如果不是,会执行完第一个while后,直接执行第二个while,更新res
start += 1 #开始位置前移
return res
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring