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))
题目描述:给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。(minimum-window-substring)示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"思路: 窗口长度不固定,先固定窗口左端,移动右端,直到找到满足条件的窗口,记录窗口长度及对应窗口; 然后固定右端,移动左端,选择最小窗口长度及对应窗口,直到窗口重新不满足条件,再开始移动右端 到右端在最右端且窗口不满足条件,此时最小窗口长度的对应