class Solution:
def minWindow(self, s: str, t: str) -> str:
if len(s)==0 or len(t)==0:
return ''
t_hashMap ={}
s_hashMap ={}
for i in t :#统计下t中每个character字符的频率
t_hashMap[i] =t_hashMap.get(i,0)+1
left =0
right =0
have =0 # 滑动窗口中涵盖字符的种类个数
start =0
best_len =inf
t_keys_cnt =len(t_hashMap)
while right <len(s):
s_hashMap[s[right]]=s_hashMap.get(s[right],0)+1
#if s_hashMap[s[right]] ==t_hashMap[s[right]] # s_hashMap[s[right]] 字符存在于t_hashMap ,python用iscontainer还是其他方法?
if s[right] in t_hashMap:
#s_hashMap[s[right]] +=1 #这里不能无条件的增加一次, 之前就加入过;s_hashMap.get(s[right],0)+1
if s_hashMap[s[right]] == t_hashMap[s[right]]:#说明窗口新出现的字符,大于,说明要么是重复出现,要么是不符合的字符,t中不存在的。 只有等于时候才需要更新have的数量。
have +=1
while( have ==t_keys_cnt) :#窗口符合条件,更新全局窗口的起点和长度,缩小空间
if (right-left+1 )<best_len:
best_len =right-left+1
start =left #当前满足条件的起点记录
#窗口满足条件后,需要移动窗口左边界,以下一个加入元素继续判别是否满足要求
#移动left之前要对left更新,如果它在t中存在,需要在窗口中消除s[left],更新have
if s[left] in t_hashMap:
#注意:不是have -=1 ,是对数量-1,种类不一定消除了,数量是绝对减少了
s_hashMap[s[left]] -=1
if t_hashMap[s[left]]> s_hashMap[s[left]]:
have -=1
#要物理移动left
left +=1
#打破窗口条件后,需要移动right指针
right +=1
#整个while循环结束,都没有找到,就返回一个空字符串
return s[start:start+best_len] if best_len !=inf else ''