File tree Expand file tree Collapse file tree 1 file changed +88
-0
lines changed Expand file tree Collapse file tree 1 file changed +88
-0
lines changed Original file line number Diff line number Diff line change 1+ #### 76. 最小覆盖子串
2+
3+ 难度:困难
4+
5+ ---
6+
7+ 给你一个字符串 ` s ` 、一个字符串 ` t ` 。返回 ` s ` 中涵盖 ` t ` 所有字符的最小子串。如果 ` s ` 中不存在涵盖 ` t ` 所有字符的子串,则返回空字符串 ` "" ` 。
8+
9+ ** 注意:**
10+
11+ * 对于 ` t ` 中重复字符,我们寻找的子字符串中该字符数量必须不少于 ` t ` 中该字符数量。
12+ * 如果 ` s ` 中存在这样的子串,我们保证它是唯一的答案。
13+
14+ ** 示例 1:**
15+
16+ ```
17+ 输入:s = "ADOBECODEBANC", t = "ABC"
18+ 输出:"BANC"
19+ 解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
20+ ```
21+
22+ ** 示例 2:**
23+
24+ ```
25+ 输入:s = "a", t = "a"
26+ 输出:"a"
27+ 解释:整个字符串 s 是最小覆盖子串。
28+ ```
29+
30+ ** 示例 3:**
31+
32+ ```
33+ 输入: s = "a", t = "aa"
34+ 输出: ""
35+ 解释: t 中两个字符 'a' 均应包含在 s 的子串中,
36+ 因此没有符合条件的子字符串,返回空字符串。
37+ ```
38+
39+ ** 提示:**
40+
41+ * ` ^m == s.length `
42+ * ` ^n == t.length `
43+ * ` 1 <= m, n <= 10^5 `
44+ * ` s ` 和 ` t ` 由英文字母组成
45+
46+ ** 进阶:** 你能设计一个在 ` o(m+n) ` 时间内解决此问题的算法吗?
47+
48+ ---
49+
50+ 滑动窗口:
51+
52+ 每次循环移动右移一次右指针,移动的过程中根据字符是否完全覆盖的情况循环右移左指针。第二个循环的过程中记录窗口长度是否为最小值。
53+
54+ ``` Go
55+ func minWindow (s string , t string ) string {
56+ alphabet , count := map [byte ]int {}, map [byte ]int {}
57+ for i := range t {
58+ alphabet[t[i]]++
59+ }
60+ ansLeft , ansRight := -1 , -1
61+ ansLen := math.MaxInt32
62+ for left , right := 0 , 0 ; right < len (s); right++ {
63+ count[s[right]]++
64+ for check (alphabet, count) && left <= right {
65+ if right - left + 1 < ansLen {
66+ ansLen = right - left + 1
67+ ansLeft = left
68+ ansRight = right + 1
69+ }
70+ count[s[left]]--
71+ left++
72+ }
73+ }
74+ if ansLeft == -1 {
75+ return " "
76+ }
77+ return s[ansLeft:ansRight]
78+ }
79+
80+ func check (alphabet , count map [byte ]int ) bool {
81+ for k , v := range alphabet {
82+ if count[k] < v {
83+ return false
84+ }
85+ }
86+ return true
87+ }
88+ ```
You can’t perform that action at this time.
0 commit comments