思路
用字典dict1来记录t字符情况(次数),用c来记录窗口滑动时覆盖字符情况,字符次数全都初始化为0。l表示滑动窗口初始位置,r表示窗口最末位置,flag表示当前窗口是否全部包含覆盖字符,是True,否:False,re表示最小覆盖子串
窗口滑动:
扩大窗口时(r向右移动):
先判断当前扩大的值是否是覆盖的值,是则c对应的键值+1,接着判断此时滑动窗口是否都包含了覆盖字符,不包含则继续扩大
包含,则尝试缩小窗口:
此时,若s[l]是属于覆盖字符:
则要去判断缩小窗口(l向右移动)后的窗口还能全覆盖字符t吗,如果覆盖则继续缩小窗口,但缩小后不能覆盖,则说明当前窗口已经是覆盖字符的最小窗口,不能再缩小了,只能扩大窗口
若s[l]不是覆盖字符,则可缩小窗口
if len(re)==0 or len(re)>=r-l+1:加上len(re)==0原因:由于最小覆盖字符初始时设置为’ ',则第一次获取到覆盖窗口时,应直接将窗口的字符串赋值给re
复杂度
时间复杂度: O(n)
代码:
class Solution:
def minWindow(self, s: str, t: str) -> str:
if len(t)>len(s):
return ""
if t==s:
return t
l=0
r=0
dict1={}
c={}
re=""
for i in t:
if i not in dict1:
dict1[i]=1
c[i]=0
else:
dict1[i]+=1
while r<len(s):
if s[r] in dict1:
c[s[r]]+=1
flag=True
for i in dict1:
if dict1[i]>c[i]:
flag=False
break
while flag:
if len(re)==0 or len(re)>=r-l+1:
re=s[l:r+1]
if s[l] in dict1:
#正好是包含的值
if c[s[l]]>dict1[s[l]]:
#可向右滑动
c[s[l]] -= 1
l+=1
else:
flag=False
else:
#可向右滑动
l+=1
r+=1
return re
ps:
关于字典的比较:python2是支持的,python3不支持
python2使用字典比较的时候,可以用c>dict1来进行判断缩小窗口,之前用这个方法有问题,然后用pycharm调试时报错了(python3版本),所以改了方法,在用python2可以试一试