Skip to content

Commit 29de968

Browse files
committed
76.最小覆盖子串,双指针,滑动窗口
1 parent 57a69fb commit 29de968

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
69. x 的平方根
3333
70. 爬楼梯
3434
72. 编辑距离
35+
76. 最小覆盖子串
3536
77. 组合
3637
78. 子集
3738
82. 删除排序链表中的重复元素 II

leetcode_Java/DoneType.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
3. 无重复字符的最长子串
164164
8. 字符串转换整数 (atoi)
165165
20. 有效的括号
166+
76. 最小覆盖子串
166167
151. 颠倒字符串中的单词
167168
415. 字符串相加
168169

leetcode_Java/Solution0076.java

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// 76. 最小覆盖子串
2+
3+
4+
/*
5+
双指针,滑动窗口:
6+
步骤一:不断增加 r 使滑动窗口增大,直到窗口包含了t的所有字符
7+
步骤二:不断增加 l 使滑动窗口缩小,因为是要求最小字串,所以将不必要的字符排除在外,使长度减小,直到碰到一个必须包含的字符,这个时候不能再去掉了,再去掉就不满足条件了,记录此时滑动窗口的长度,并保存最小值
8+
步骤三:让 l 再增加一个位置,这时滑动窗口肯定不满足条件了,那么继续从步骤一开始执行,寻找新的满足条件的滑动窗口,如此反复,直到 r 超出了字符串s范围
9+
10+
算法过程:
11+
1、变量含义:
12+
l: 滑动窗口左边界
13+
r: 滑动窗口右边界
14+
size: 最小窗口的长度
15+
count: 当前窗口字符总需求量。当次遍历中还需要几个字符才能够满足包含t中所有字符的条件,最大也就是t的长度
16+
start: 最小窗口起始位置。如果有效更新滑动窗口,记录这个窗口的起始位置,方便后续找子串
17+
need:字符需求量数组。正数表示有需求,负数表示有冗余。字符加入窗口时字符需求量减1,移出窗口时字符需求量加1
18+
2、遍历t字符串,记录字符个数,表示窗口中字符的需求量
19+
3、循环条件,右指针向右移动,不超过s的长度
20+
4、右边界字符,如果需求量大于0,则更新count减1,表示字符加入了窗口,总需求量减1
21+
5、每次遍历到的字符,在need数组中该字符需求量减1
22+
6、如果总需求量count为0,说明当前窗口已经包含了t的所有字符
23+
1)左边界字符有冗余时,则字符需求量加1,左指针右移,缩小窗口大小,字符移出窗口,循环处理
24+
2)如果当前窗口大小 小于 历史最小窗口,则记录当前最小窗口大小,并将记录此时的左边界位置
25+
3)左边界字符需求量加1,左边界右移,总需求量count减1,使得当前窗口不包含t的所有字符,重新开始寻找新的满足条件的窗口
26+
7、右边界右移,进入下一轮循环处理
27+
28+
s = "DOABECODEBANC", t = "ABC"
29+
D O A B E C O D E B A N C
30+
31+
l/r
32+
============== 步骤一 ===================
33+
D O A B E C O D E B A N C
34+
↑ ↑
35+
l r
36+
============== 步骤二 ===================
37+
D O A B E C O D E B A N C
38+
↑ ↑
39+
l r
40+
============== 步骤三 ===================
41+
D O A B E C O D E B A N C
42+
↑ ↑
43+
l r
44+
*/
45+
class Solution {
46+
public String minWindow(String s, String t) {
47+
int[] need = new int[128];
48+
for (char c : t.toCharArray()) {
49+
need[c]++;
50+
}
51+
int l = 0, r = 0, count = t.length(), start = 0, size = Integer.MAX_VALUE;
52+
while (r < s.length()) {
53+
char c = s.charAt(r);
54+
if (need[c] > 0) {
55+
count--;
56+
}
57+
need[c]--;
58+
if (count == 0) {
59+
while (need[s.charAt(l)] < 0) {
60+
need[s.charAt(l)]++;
61+
l++;
62+
}
63+
if (r - l + 1 < size) {
64+
size = r - l + 1;
65+
start = l;
66+
}
67+
need[s.charAt(l)]++;
68+
l++;
69+
count++;
70+
}
71+
r++;
72+
}
73+
return size == Integer.MAX_VALUE ? "" : s.substring(start, start + size);
74+
}
75+
}

0 commit comments

Comments
 (0)