python
class Solution:
def minWindow(self,s:str,t:str)->str:
if len(s)==0 or len(t)==0:
return ""
if len(s)<len(t):
return ""
tcount={}
window={}
left=0
need=0
ansleft,ansright=0,-1
min_length=float("inf") #初始化最小值为无穷大
for i in t: #先统计子串中各个字符的频次
tcount[i]=tcount.get(i,0)+1
for right,x in enumerate(s): #开始遍历主串
if x in tcount: #若当前字符在tcount中,更新window窗口
window[x]=window.get(x,0)+1
if window[x]==tcount[x]: #对比两个哈希表中的次数是否一致,若一致则匹配度加一
need+=1
while need==len(tcount): #当匹配度等于tcount长度时,说明匹配成功,需要收集答案
if right-left+1<=min_length: #当前长度小于min_length时,更新min_length
min_length=right-left+1
ansleft,ansright=left,right #更新下标
if s[left] in tcount: #移动left指针前,先判断当前字符是否在tcount中
window[s[left]]-=1 #若在,需要先处理该字符,首先window对应频次减一
if window[s[left]]<tcount[s[left]]: #比较频次是否相等,若小于,匹配度减一
need-=1
left+=1 #移动指针
if ansright<0: #判断是否更新过右边指针
return ""
return s[ansleft:ansright+1] #切片返回最小子串
思想:滑动窗口+哈希表:首先用哈希表tcount统计子串的频次,其次开始遍历主串。先设定一个need用于记录匹配次数,开始遍历主串,对于每一个遍历到的字符,先判断是否在哈希表tcount中,如果在,就在哈希表window中频次加一,同时判断window窗口与tcount窗口关于该字符的次数是否相等,若相等,则匹配度need加一。当匹配度need等于哈希表tcount的长度时,表明此时完全匹配,可以开始收集答案并且移动左指针left。移动left时,需要判断left下标对应的字符是否存在于哈希表tcount中,若在,则window窗口对应字符的次数需要减一,然后再判断该字符在window和tcount中的次数是否一致,如果不一致(window<tcount),则匹配度need减一。循环结束后,先判断初始化的右指针是否更新过,若没有,则返回空字符串。若更新过,则返回切片。