题目:
滑动窗口:
window[left, right],考虑下面问题:
- 当移动 right 时要更新哪些数据
- 什么情况下 right 要停止扩大,开始移动 left 缩小窗口
- 当移动 left 时要更新哪些数据
- 我们要的结果是在扩大窗口还是缩小窗口时进行更新?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <string> #include <unordered_map>
using std::unordered_map; using std::string;
class Solution { public: string minWindow(string s, string t) { int i = 0, j = 0, n = s.size(); int start; int min_len = n + 1; int valid = 0; unordered_map<char, int> need; unordered_map<char, int> window;
for (char &ch : t) need[ch]++;
for (j = 0; j < n; j++) { if (!need.count(s[j])) continue;
window[s[j]]++;
if (window[s[j]] == need[s[j]]) valid++;
while (valid == need.size()) { if (j - i + 1 < min_len) { start = i; min_len = j - i + 1; } if (need.count(s[i])) { if (window[s[i]] == need[s[i]]) valid--;
window[s[i]]--; } i++; } } return min_len == n + 1 ? "" : s.substr(start, min_len); } };
|
leetcode hot 100 rewrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <string> #include <unordered_map>
using std::string; using std::unordered_map;
class Solution { public: string minWindow(string s, string t) { int slen = s.size(), tlen = t.size(); int left = 0, right = 0; int valid = 0, total_valid = 0; int min_len = slen + 1, res_start = 0; unordered_map<char, int> need, window;
if (tlen > slen) return "";
for (char ch : t) need[ch]++;
total_valid = need.size();
while (right < slen) { window[s[right]]++; if (window[s[right]] == need[s[right]]) valid++; right++;
while (left < right && valid >= total_valid) {
if (right - left < min_len) { min_len = right - left; res_start = left; }
if (window[s[left]] == need[s[left]]) valid--;
window[s[left]]--;
left++; } } if(min_len != slen+1) return s.substr(res_start, min_len); else return ""; } };
|