LeetCode 76 最小覆盖子串
最小覆盖子串
题目描述
题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入: S = "ADOBECODEBANC", T = "ABC"
输出: "BANC"
说明:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
题解
这题属于滑动窗口类型。思路简单来说就是,用start、end控制一个滑动窗口。当滑动窗口中未包含所有T中字符,end右移;当滑动窗口中包含所有T中字符时,start右移。统计包含T中所有字符时(即start开始右移时),滑动窗口的最小长度,并记录长度最小时候的子串。
class Solution:
def minWindow(self, s: str, t: str) -> str:
from collections import defaultdict
occ = defaultdict(int) #occ记录滑动窗口中的字符情况
for c in t:
occ[c] += 1
#用start和end表示一个滑动窗口的开始和结尾
#cnt记录滑动窗口中 不包含 T中字符的个数
#minlen记录包含T中所有字符时 滑动窗口的最小长度
start, end, cnt, minlen = 0, 0, len(t), float("inf")
res = ""
while end < len(s):
if occ[s[end]] > 0:
cnt -= 1
occ[s[end]] -= 1
end += 1
while cnt == 0:
if minlen > end - start:
minlen = end - start
res = s[start:end]
if occ[s[start]] == 0:
cnt += 1
occ[s[start]] += 1
start += 1
return res