leetcode76-最小覆盖子串
1、题目
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
2、解析
class Solution:
def minWindow(self, s: str, t: str) -> str:
# 初始化,s_hash 即 t_hash 全零
s_hash, t_hash = {}, {} # collections.defaultdict(int) 或 collections.Counter(t)
left, right = 0, 0
length = float('inf')
output = ''
for i in t:
if i not in t_hash:
t_hash[i] = 1
s_hash[i] = 0
else:
t_hash[i] += 1
# 滑窗
while right < len(s):
if s[right] in t: s_hash[s[right]] += 1
# 若窗包含所有元素
while all(map(lambda x: s_hash[x] >= t_hash[x], t_hash.keys())):
# 若更短,则更新
if length > right-left+1:
length = right-left+1
output = s[left:right+1]
if s[left] in t: s_hash[s[left]] -= 1
left += 1
right += 1
return output