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