LeetCode第七十六题—最小覆盖子串
自己代码的开源仓库:click here 欢迎Star和Fork :)
题目描述
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
1 |
|
代码
学习一手滑窗模板
1 | lo, hi = 0, 0 |
Sliding Window
参考带佬的滑窗模板版本:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
ans = ''
minLen = float('Inf')
lo, hi = 0, 0
window = Counter()
t = Counter(t)
while hi < len(s):
# 入窗
window[s[hi]] += 1
# 维护窗口大小
while all(map(lambda x: window[x] >= t[x], t.keys())):
# 筛选符合条件的最短长度
if hi - lo + 1 < minLen:
ans = s[lo:hi+1]
minLen = hi - lo + 1
# 出窗
window[s[lo]] -= 1
lo += 1
# 窗口右端右移
hi += 1
return ans
最后一个用例超时版本
感觉思路很清晰,一写就超时 妈的
感觉可以在时间复杂度上得到很大的优化,比如统计信息等等。for 循环太多了
1 | import copy |