Skip to content

Commit d0c77c4

Browse files
zhangzz2015gitbook-bot
authored andcommitted
GitBook: [greyireland#29] No subject
1 parent 09c731e commit d0c77c4

File tree

1 file changed

+42
-105
lines changed

1 file changed

+42
-105
lines changed

advanced_algorithm/slide_window.md

+42-105
Original file line numberDiff line numberDiff line change
@@ -48,63 +48,49 @@ void slidingWindow(string s, string t) {
4848
4949
> 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串
5050
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,看该可行解可以保持多久,同时找到最小的可行解。
8052
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+
};
10894
```
10995

11096
[permutation-in-string](https://leetcode-cn.com/problems/permutation-in-string/)
@@ -242,55 +228,6 @@ func max(a,b int)int{
242228
}
243229
```
244230

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-
294231

295232

296233
## 总结

0 commit comments

Comments
 (0)