题解:滑动窗口
在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。
class Solution:
def minWindow(self, s: str, t: str) -> str:
s_len=len(s)
t_len=len(t)
ans=""
flag=0
# if s_len<t_len:
# return ""
# 建立t的字典
t_dic={}
for ch in t:
t_dic[ch]=t_dic.get(ch,0)+1
# 建立window的字典
window_dic={}
# 滑动窗口
left_pointer=0
right_pointer=0
while right_pointer<s_len:
window_dic[s[right_pointer]]=window_dic.get(s[right_pointer],0)+1
# 若不包含
if not self.Contain(t_dic,window_dic):
right_pointer+=1
continue
# 若包含
else:
if flag==0:
ans=s[left_pointer:right_pointer+1]
flag=1
temp_ans=s[left_pointer:right_pointer+1]
ans=temp_ans if len(temp_ans)<len(ans) else ans
# 先删除,left_pointer再向右移动
window_dic[s[left_pointer]]-=1
left_pointer+=1
if left_pointer>=s_len:
break
while self.Contain(t_dic,window_dic):
temp_ans=s[left_pointer:right_pointer+1]
ans=temp_ans if len(temp_ans)<len(ans) else ans
window_dic[s[left_pointer]]-=1
left_pointer+=1
continue
right_pointer+=1
return ans
def Contain(self,t_dic,window_dic):
for t_key,t_value in t_dic.items():
if t_key not in window_dic:
return False
else:
if window_dic[t_key]<t_value:
return False
return True