给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
输入: S = “ADOBECODEBANC”, T = “ABC”
输出: “BANC”
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
典型双指针滑动串口题目,先将t建dict,然后右指针滑动,如果右指针处数在t_dict,那么看是否需要count+1,再判断count和len_t的大小,如果相同就判断是不是最短,然后左指针滑动,看左指针处数是否在t_dict,根据这个修改count:
class Solution:
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
if len(s) < len(t):
return ''
left, right, count, t_dict, len_s = 0, 0, 0, {}, len(s)
res, min_len, len_t = '', len_s+1, len(t)
for c in t:
t_dict[c] = t_dict.get(c, 0) + 1
while right < len_s:
a = s[right]
if a in t_dict:
t_dict[a] -= 1
if t_dict[a] >= 0:
count += 1 # 如果增加了个新元素count加一
while count == len_t:
if right-left+1 < min_len:
res = s[left:right+1]
min_len = right-left+1
b = s[left]
if b in t_dict:
t_dict[b] += 1
if t_dict[b] > 0: # 如果该处元素在t中
count -= 1
left += 1
right += 1
return res