给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
PS:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
一刷:滑动窗口,滑动后判断是否包含所有字符即可
class Solution:
def minWindow(self, s: str, t: str) -> str:
tmap = collections.defaultdict(int)
for i in t:
tmap[i] += 1
left = 0
right = 0
minW = ""
slen = len(s)
tlen = len(t)
def check():
for i in tmap:
if tmap[i] >= 1:
return False
return True
# 第一个left:
for i in range(slen):
if s[i] in tmap:
left = i
right = left + tlen
break
if right == 0 or right > slen:
return minW
# 初始窗口
for i in range(left, right):
if s[i] in tmap:
tmap[s[i]] -= 1
flag = check()
# 进行滑动
while(right <= slen):
while(check()):
current = s[left: right]
if right-left == tlen:
return current
if minW == "":
minW = current
minW = minW if len(minW) <= len(s[left: right]) else s[left: right]
if s[left] in tmap:
tmap[s[left]] += 1
left += 1
else:
while(s[left] not in tmap):
left += 1
while(check() == False):
right += 1
if right > slen:
return minW
while(s[right-1] not in tmap):
right += 1
if right > slen:
return minW
tmap[s[right-1]] -= 1
return minW