@@ -48,63 +48,49 @@ void slidingWindow(string s, string t) {
48
48
49
49
> 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串
50
50
51
- ```go
52
- func minWindow(s string, t string) string {
53
- // 保存滑动窗口字符集
54
- win := make(map[byte]int)
55
- // 保存需要的字符集
56
- need := make(map[byte]int)
57
- for i := 0; i < len(t); i++ {
58
- need[t[i]]++
59
- }
60
- // 窗口
61
- left := 0
62
- right := 0
63
- // match匹配次数
64
- match := 0
65
- start := 0
66
- end := 0
67
- min := math.MaxInt64
68
- var c byte
69
- for right < len(s) {
70
- c = s[right]
71
- right++
72
- // 在需要的字符集里面,添加到窗口字符集里面
73
- if need[c] != 0 {
74
- win[c]++
75
- // 如果当前字符的数量匹配需要的字符的数量,则match值+1
76
- if win[c] == need[c] {
77
- match++
78
- }
79
- }
51
+ 思路:使用标准sliding window,利用hash map,记录是否包含所有S1的字符,先移动right,找到一个可行解,再移动left,看该可行解可以保持多久,同时找到最小的可行解。
80
52
81
- // 当所有字符数量都匹配之后,开始缩紧窗口
82
- for match == len(need) {
83
- // 获取结果
84
- if right-left < min {
85
- min = right - left
86
- start = left
87
- end = right
88
- }
89
- c = s[left]
90
- left++
91
- // 左指针指向不在需要字符集则直接跳过
92
- if need[c] != 0 {
93
- // 左指针指向字符数量和需要的字符相等时,右移之后match值就不匹配则减一
94
- // 因为win里面的字符数可能比较多,如有10个A,但需要的字符数量可能为3
95
- // 所以在压死骆驼的最后一根稻草时,match才减一,这时候才跳出循环
96
- if win[c] == need[c] {
97
- match--
98
- }
99
- win[c]--
100
- }
101
- }
102
- }
103
- if min == math.MaxInt64 {
104
- return ""
105
- }
106
- return s[start:end]
107
- }
53
+ ```go
54
+ class Solution {
55
+ public:
56
+ string minWindow(string s, string t) {
57
+
58
+ if(t.size()> s.size())
59
+ return "";
60
+ vector<int> t_map(256, 0);
61
+ vector<int> s_map(256, 0);
62
+ for(int i=0; i< t.size(); i++)
63
+ t_map[t[i]]++;
64
+ int left =0;
65
+ int right = 0;
66
+ int count =0;
67
+ int ret = INT_MAX;
68
+ int ret_start = -1;
69
+ while(right < s.size()){
70
+
71
+ s_map[s[right]]++;
72
+ if(s_map[s[right]] <= t_map[s[right]])
73
+ count++;
74
+
75
+ while(count==t.size())
76
+ {
77
+ if(right - left + 1 < ret)
78
+ {
79
+ ret = right - left+1;
80
+ ret_start = left;
81
+ }
82
+ s_map[s[left]]--;
83
+ if(s_map[s[left]]< t_map[s[left]])
84
+ count--;
85
+ left++;
86
+ }
87
+
88
+ right++;
89
+ }
90
+
91
+ return ret == INT_MAX? "" : s.substr(ret_start, ret);
92
+ }
93
+ };
108
94
```
109
95
110
96
[ permutation-in-string] ( https://leetcode-cn.com/problems/permutation-in-string/ )
@@ -242,55 +228,6 @@ func max(a,b int)int{
242
228
}
243
229
```
244
230
245
- [ 76 Minimum Window Substring] ( https://leetcode.com/problems/minimum-window-substring/ )
246
-
247
- 思路:使用标准sliding window,利用hash map,记录是否包含所有S1的字符,先移动right,找到一个可行解,再移动left,看该可行解可以保持多久,同时找到最小的可行解。
248
-
249
- ``` cpp
250
- // Some code
251
- class Solution {
252
- public:
253
- string minWindow(string s, string t) {
254
-
255
- if(t.size()> s.size())
256
- return "";
257
- vector<int > t_map(256, 0);
258
- vector<int > s_map(256, 0);
259
- for(int i=0; i< t.size(); i++)
260
- t_map[ t[ i]] ++;
261
- int left =0;
262
- int right = 0;
263
- int count =0;
264
- int ret = INT_MAX;
265
- int ret_start = -1;
266
- while(right < s.size()){
267
-
268
- s_map[ s[ right]] ++;
269
- if(s_map[ s[ right]] <= t_map[ s[ right]] )
270
- count++;
271
-
272
- while(count==t.size())
273
- {
274
- if(right - left + 1 < ret)
275
- {
276
- ret = right - left+1;
277
- ret_start = left;
278
- }
279
- s_map[ s[ left]] --;
280
- if(s_map[ s[ left]] < t_map[ s[ left]] )
281
- count--;
282
- left++;
283
- }
284
-
285
- right++;
286
- }
287
-
288
- return ret == INT_MAX? "" : s.substr(ret_start, ret);
289
- }
290
- };
291
-
292
- ```
293
-
294
231
295
232
296
233
## 总结
0 commit comments