Skip to content

Commit c39fc60

Browse files
committed
四刷76
1 parent f421885 commit c39fc60

File tree

5 files changed

+73
-7
lines changed

5 files changed

+73
-7
lines changed

docs/0076-minimum-window-substring.adoc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[#0076-minimum-window-substring]
22
= 76. 最小覆盖子串
33

4-
https://leetcode.cn/problems/minimum-window-substring/[LeetCode - 76. 最小覆盖子串 ^]
4+
https://leetcode.cn/problems/minimum-window-substring/[LeetCode - 76. 最小覆盖子串^]
55

6-
给你一个字符串 `s` 、一个字符串 `t` 。返回 `s` 中涵盖 `t` 所有字符的最小子串。如果 `s` 中不存在涵盖 `t` 所有字符的子串,则返回空字符串 `""`
6+
给你一个字符串 `s`、一个字符串 `t`。返回 `s` 中涵盖 `t` 所有字符的最小子串。如果 `s` 中不存在涵盖 `t` 所有字符的子串,则返回空字符串 `""`
77

88
*注意:*
99

@@ -35,7 +35,6 @@ https://leetcode.cn/problems/minimum-window-substring/[LeetCode - 76. 最小覆
3535
因此没有符合条件的子字符串,返回空字符串。
3636
....
3737

38-
3938
*提示:*
4039

4140
* `m == s.length`
@@ -47,9 +46,11 @@ https://leetcode.cn/problems/minimum-window-substring/[LeetCode - 76. 最小覆
4746

4847
== 思路分析
4948

50-
滑动窗口
49+
滑动窗口:字母不够时,扩大窗口;字母足够时,开始缩小窗口。
50+
51+
image::images/0076-10.gif[{image_attr}]
5152

52-
image::images/0076-01.gif[{image_attr}]
53+
image::images/0076-11.png[{image_attr}]
5354

5455
[[src-0076]]
5556
[tabs]
@@ -80,11 +81,20 @@ include::{sourcedir}/_0076_MinimumWindowSubstring_2.java[tag=answer]
8081
include::{sourcedir}/_0076_MinimumWindowSubstring_3.java[tag=answer]
8182
----
8283
--
84+
85+
四刷::
86+
+
87+
--
88+
[{java_src_attr}]
89+
----
90+
include::{sourcedir}/_0076_MinimumWindowSubstring_4.java[tag=answer]
91+
----
92+
--
8393
====
8494

8595
== 参考资料
8696

8797
. https://leetcode.cn/problems/minimum-window-substring/solutions/257359/zui-xiao-fu-gai-zi-chuan-by-leetcode-solution/[76. 最小覆盖子串 - 官方题解^]
98+
. https://leetcode.cn/problems/minimum-window-substring/solutions/2713911/liang-chong-fang-fa-cong-o52mn-dao-omnfu-3ezz/[76. 最小覆盖子串 - 两种方法:从 O(52m+n) 到 O(m+n),附题单^]
8899
. https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/9749/hua-dong-chuang-kou-tong-yong-si-xiang-jie-jue-zi-/[438. 找到字符串中所有字母异位词 - 我写了一首诗,把滑动窗口算法变成了默写题^]
89-
. https://leetcode.cn/problems/minimum-window-substring/solutions/257359/zui-xiao-fu-gai-zi-chuan-by-leetcode-solution/[76. 最小覆盖子串 - 官方题解^]
90-
100+
. https://leetcode.cn/problems/minimum-window-substring/solutions/258513/tong-su-qie-xiang-xi-de-miao-shu-hua-dong-chuang-k/[76. 最小覆盖子串 - 简简单单,非常容易理解的滑动窗口思想^]
File renamed without changes.

docs/images/0076-11.png

19.4 KB
Loading

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,6 +1929,11 @@ endif::[]
19291929
|{doc_base_url}/0090-subsets-ii.adoc[题解]
19301930
|✅ 子集模式。需要注意重复元素的处理。如果元素中有重复元素,那么就需要先对元素排序,遇到重复元素时,就不能对虽有已有元素都添加新元素了。只需要针对上一次新添加的子集添加新元素即可,依次执行,直到有不重复元素则再次恢复成从全部子集添加元素。
19311931

1932+
|{counter:codes2503}
1933+
|{leetcode_base_url}/minimum-window-substring/[76. 最小覆盖子串^]
1934+
|{doc_base_url}/0076-minimum-window-substring.adoc[题解]
1935+
|✅ 滑动窗口。字母不够时,扩大窗口;字母足够时,开始缩小窗口。
1936+
19321937
|===
19331938

19341939
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.Objects;
6+
7+
public class _0076_MinimumWindowSubstring_4 {
8+
// tag::answer[]
9+
10+
/**
11+
* @author D瓜哥 · https://www.diguage.com
12+
* @since 2025-11-17 21:03:03
13+
*/
14+
public String minWindow(String s, String t) {
15+
Map<Character, Integer> counter = new HashMap<>();
16+
for (char c : t.toCharArray()) {
17+
counter.put(c, counter.getOrDefault(c, 0) + 1);
18+
}
19+
int left = 0, right = 0;
20+
char[] chars = s.toCharArray();
21+
int length = Integer.MAX_VALUE;
22+
String result = "";
23+
Map<Character, Integer> window = new HashMap<>();
24+
int valid = 0;
25+
while (right < chars.length) {
26+
char c = chars[right++];
27+
window.put(c, window.getOrDefault(c, 0) + 1);
28+
if (counter.containsKey(c) && Objects.equals(counter.get(c), window.get(c))) {
29+
valid++;
30+
}
31+
while (valid == counter.size()) {
32+
if (right - left < length) {
33+
length = right - left;
34+
result = s.substring(left, right);
35+
}
36+
char lc = chars[left++];
37+
Integer cnt = window.getOrDefault(lc, 0);
38+
if (counter.containsKey(lc) && Objects.equals(cnt, counter.get(lc))) {
39+
valid--;
40+
}
41+
window.put(lc, cnt - 1);
42+
}
43+
}
44+
return result;
45+
}
46+
47+
// end::answer[]
48+
static void main() {
49+
new _0076_MinimumWindowSubstring_4().minWindow("ADOBECODEBANC", "ABC");
50+
}
51+
}

0 commit comments

Comments
 (0)