def minWindow(s,t):
#把t的字符存储为字典的形式,也记录窗口内各个字符缺的个数
dict_map={}
for i in t:
if i in dict_map:
dict_map[i]+=1
else:
dict_map[i]=1
# 窗口左端
left = 0
#窗口右端
right=0
#选定窗口字符串还需满足几个字符就包含待定字符串了
count=len(t)
#记录包含待定字符串的字符串的长度,方便找出最短的那个
length=len(s)
#最终结果
res='找不到'
#开始时左端为0,右端依次增大
while right<len(s):
#右端字符包含待定字符串的字符时
if s[right] in dict_map:
#字典里该字符对应的值大于0时说明该字符在窗口内还未全部出现
if dict_map[s[right]]>0:
count-=1
#字典字符若为负数,则说明有字符多出现了,有可能减小窗口
# 如AABC包含ABC的最小窗口为ABC,第一次count=0时dict_map={'A':-1,'B':0,'C':0,}
dict_map[s[right]]-=1
right+=1
#找到包含待定字符串的字符后,开始移动左端
while count==0 or left==len(s):
#若新窗口的长度小于之前最小长度的窗口,则替换掉
if length>right-left:
length=right-left
res=s[left:right]
#当左端字符在待定字符串t里时,有可能新窗口不完全包含t了
if s[left] in dict_map:
dict_map[s[left]]+=1
#当字典内某字符的值大于1时,表示窗口又缺该字符了
if dict_map[s[left]]>0:
#缺的字符数加1
count+=1
left+=1
return res
s = "ADOBECODEBANC"
t = "ABC"
print(minWindow(s,t))