给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
如果 S 中不存这样的子串,则返回空字符串 ""。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-window-substring
思路:滑窗法,设置left、right指针,right用于遍历扩大窗口找到满足条件的窗口,找到满足的窗口后,移动left指针,缩小窗口范围,找出当前满足条件的最小窗口。
from collections import Counter
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
# 滑动窗口 每次找到窗口后,再从l到r搜索最小窗口 r用来扩张窗口,l用来缩小窗口
if not t or not s:
return ""
# Counter计数器,继承自dict
t=Counter(t)
# 滑动指针
l,r=0,0
# 统计当前字符串计数
map={}
# 统计当前窗口满足字符的个数
count=0
res=[float('inf'),0,0]
# 标记是否存在解
flag=False
while r<len(s):
char=s[r]
map[char]=map.get(char,0)+1
if char in t and map[char]==t[char]:
count+=1
# 若找到所有字符 缩小区间
while count==len(t) and l<=r:
flag=True
if r-l+1<res[0]:
res=[r-l+1,l,r]
# 从l开始缩小区间
char2=s[l]
map[char2]-=1
if char2 in t and map[char2]<t[char2]:
count-=1
l+=1
r+=1
return s[res[1]:res[2]+1] if flag else ''