76. 最小覆盖子串
https://leetcode-cn.com/problems/minimum-window-substring/
解法一:滑动窗口
将t的字符存入字典map中,t中未出现而s中出现的词频设为0。这样的目的是t要求的字符词频为正数。
(贪心法?)由于题目要求的只是‘包含’,用[begin…end]表示窗口,end先向前移动,用直方图法判断子串是否符合t。若符合,begin再向前压缩窗口。
class Solution:
def minWindow(self, s: str, t: str) -> str:
# 先统计词频,t中的字符词频大于0,在s中不在t中的等于0
map = dict()
for c in t:
if c in map:
map[c] += 1
else:
map[c] = 1
for c in s:
if c not in map:
map[c] = 0
count = 0 #表示匹配情况
begin, end = 0, 0
d = sys.maxsize #记录窗口最小值
head = 0 #记录最小窗口起始
while end < len(s):
if map[s[end]] > 0: #只有遇到需要的字符(词频大于0的),count才计数
count += 1
map[s[end]] -= 1 #当前字符词频减1
end += 1
while count == len(t): #若匹配,begin前移
if end - begin < d: #找到更小的窗口
d = end - begin
head = begin
if map[s[begin]] == 0: #若移动处是需要的字符,修改count
count -= 1
map[s[begin]] += 1
begin += 1
if d == sys.maxsize: #若找不到
return ""
else:
return s[head:head+d]解法二:滑动窗口模板
方法一不适用于其他滑动窗口题,关键在于只用一个map无法准确描述匹配情况
最后更新于