题目描述:
解决思路:滑动窗口
1.
初始,
left
指针和
right
指针都指向
S
的第一个元素
.
2.
将
right
指针右移,扩张窗口,直到得到一个可行窗口,亦即包含
TT
的全部字母的窗口。
3.
得到可行的窗口后,将
left
指针逐个右移,若得到的窗口依然可行,则更新最小窗口大小。
4.
若窗口不再可行,则跳转至
2
。
代码实现如下:
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
dict_t = collections.Counter(t) #对t中的字母计数
required = len(dict_t) #获得dict_t的长度
l, r = 0, 0 #初始化窗口
formed = 0 #用来追踪在当前窗口中出现的t中的字母的个数(重复的字母只计数一次)
window_counts = {} #
ans = float("inf"), None, None
while r < len(s):
#从右边开始增加字母到窗口
character = s[r]
window_counts[character] = window_counts.get(character, 0) + 1
#判断该字母是否满足题目要求
if character in dict_t and window_counts[character] == dict_t[character]:
formed += 1
while l <= r and formed == required:
character = s[l]
#对当前最小的窗口大小进行保存
if r - l + 1 < ans[0]:
ans = (r -l + 1, l , r)
#窗口左指针右移
window_counts[character] -= 1
if character in dict_t and window_counts[character] < dict_t[character]:
formed -= 1
l += 1
r += 1
return "" if ans[0] == float("inf") else s[ans[1] : ans[2] + 1]
提交结果: