Skip to content

Commit 79d5a51

Browse files
committed
Create 26. 最小覆盖子串.md
1 parent 8ae037c commit 79d5a51

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

26. 最小覆盖子串.md

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
***给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。***
2+
3+
```
4+
输入:s = "ADOBECODEBANC", t = "ABC"
5+
输出:"BANC"
6+
```
7+
8+
```
9+
#我们可以用滑动窗口的思想解决这个问题。在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。
10+
#我们在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。
11+
12+
class Solution:
13+
def minWindow(self, s: str, t: str) -> str:
14+
left = 0
15+
min_len = float('inf')
16+
res = ''
17+
#用一个哈希表动态维护窗口中所有的字符以及它们的个数
18+
target = {}
19+
cnt = 0
20+
for c in t:
21+
if c not in target:
22+
target[c] = 1
23+
cnt += 1
24+
else:
25+
target[c] += 1
26+
27+
for ind, c in enumerate(s):
28+
if c in target:
29+
target[c] -= 1
30+
if target[c] == 0:
31+
cnt -= 1
32+
while not cnt:
33+
cur_len = ind-left+1
34+
if cur_len < min_len:
35+
min_len = cur_len
36+
res = s[left:ind+1]
37+
if s[left] in target:
38+
target[s[left]] += 1
39+
if target[s[left]] > 0:
40+
cnt += 1
41+
left += 1
42+
return res
43+
```

0 commit comments

Comments
 (0)