leetcode 76.最小覆盖子串(python)
给你一个字符串 S、一个字符串 T 。请你设计一种算法,可以在 O(n) 的时间复杂度内,从字符串 S 里面找出:包含 T 所有字符的最小子串。
示例:
输入:S = "ADOBECODEBANC", T = "ABC"
输出:"BANC"
提示:
- 如果 S 中不存这样的子串,则返回空字符串
""
。 - 如果 S 中存在这样的子串,我们保证它是唯一的答案。
滑动窗口
class Solution(object):
def minWindow(self, s, t):
need = {}
for c in t:
need[c] = need.get(c, 0) + 1
needLen = len(t)
i = 0
res = (0, float('inf'))
# 3个步骤
# 1.增加右边界使滑窗包含t
for j, c in enumerate(s):
if need.get(c, 0) > 0:
needLen -= 1
need[c] = need.get(c, 0) - 1
# 2.收缩左边界知道无法再去掉元素
if needLen == 0:
while True:
c = s[i]
if need.get(c, 0) == 0: # 表示再去掉急不行
break
else:
need[c] = need.get(c, 0) + 1
i += 1
if j - i < res[1] - res[0]:
res = (i, j)
# 3.i多增加一个位置, 准备开始下一个循环
need[s[i]] = need.get(s[i], 0) + 1
needLen += 1
i += 1
return '' if res[1] > len(s) else s[res[0]:res[1]+1]