from collections import defaultdict, Counter
classSolution(object):def__init__(self):print(1)defminWindow(self, s, t):"""
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串
:param s:
:param t:
:return: 返回
"""ifnot s ornot t:return""#用来统计字符串t中每个字符出现的次数
dict_t = Counter(t)#用来统计窗口中每个字符出现的次数
windows_s = defaultdict(int)#用来存放字符串t不重复字符个数
required =len(dict_t)#左右窗口的位置
l, r =0,0#保存指定字符串最小窗口的位置
resStart, resLen =0,float('inf')#windows 完全包含t中不重复字符的个数
formed =0while r <len(s):#增加右指针字母的计数
windows_s[s[r]]+=1#如果右指针的字母在t中,且计数相等,则formed计数增加if s[r]in dict_t and windows_s[s[r]]== dict_t[s[r]]:
formed +=1#当窗口完全包含字符串时,尝试缩小窗口while l <= r and formed == required:#更新最小窗口if r-l+1< resLen:
resStart, resLen = l, r-l+1#左指针计数减少
windows_s[s[l]]-=1#如果左指针字符在窗口中,且windows窗口的计数小于t的计数,减少formed的计数if s[l]in dict_t and windows_s[s[l]]< dict_t[s[l]]:
formed -=1#移动左指针
l +=1#移动右指针
r +=1return""if resLen ==float('inf')else s[resStart:resStart+resLen]if __name__ =='__main__':
win = Solution()
result = win.minWindow('abdcccsslsllabc','lsla')print(result)