题目
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
Example:
Input: S = “ADOBECODEBANC”, T = “ABC”
Output: “BANC”
Note:
If there is no such window in S that covers all characters in T, return the empty string “”.
If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
滑动窗口
使用前后指针表示滑动窗口,前指针扩大窗口表示可行的解,后指针缩小窗口表示最优解。
python 代码
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
need = dict()
windows = dict()
for i in t:
if i in need:
need[i] += 1
else:
need[i] = 1
for i in s:
windows[i] = 0
l ,r = 0, 0
valid = 0
start = 0
lens = float('inf')
while r<len(s):# 滑动窗口循环条件
c = s[r]
r +=1
if c in t:
windows[c] += 1
if need[c] == windows[c]:
valid += 1
while valid == len(need):
if r - l < lens:
start = l
lens = r-l
d = s[l]
l += 1
if d in need:
if need[d] == windows[d]:
valid -= 1
windows[d] -= 1
if lens == float('inf'):
return ""
else:
return s[start:start+lens]
滑动窗口模板
首先推荐labuladuo的leetcode算法总结。
滑动窗口模板:
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
need = dict()
windows = dict()
for i in t:
if i in need:
need[i] += 1
else:
need[i] = 1
for i in s:
windows[i] = 0
l ,r = 0, 0
valid = 0
start = 0
lens = float('inf')
while r<len(s):# 滑动窗口循环条件
c = s[r]
r +=1
......# 前指针扩大窗口需更新的数据
........# 窗口停止滑动条件
......# 判断是否合法子串
d = s[l]
l += 1
.....# 后指针缩小窗口需更新的数据
.....# 结果返回值
使用模板时需想清楚四个问题:
1、当移动 r 扩大窗口,即加入字符时,应该更新哪些数据?
2、什么条件下,窗口应该暂停扩大?
3、当移动 l 缩小窗口,即移出字符时,应该更新哪些数据?
4、我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?