Timeline
sliding window
Title:
Classic sliding window problem
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
| #include <vector> #include <string>
using std::string; using std::vector;
class Solution { public: vector<int> findAnagrams(string s, string p) { int i, index, valid = 0, need_valid = 0; int left = 0, right; int slen = s.size(), plen = p.size(); vector<int> need(26, 0); vector<int> curr(26, 0); vector<int> ret;
for (i = 0; i < plen; i++) need[p[i] - 'a']++; for (i = 0; i < 26; i++) if (need[i] > 0) need_valid++;
for (right = 0; right < slen; right++) { if (right - left + 1 > plen) { index = s[left] - 'a';
if (curr[index] == need[index]) valid--;
curr[index]--;
left++; }
index = s[right] - 'a'; curr[index]++;
if (curr[index] == need[index]) valid++;
if (valid == need_valid) ret.push_back(left); } return ret; } };
|
acm mode 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
| #include <iostream> #include <string> #include <unordered_map> using namespace std;
int main() { int n; string s, p; cin >> s; cin >> p; n = s.size();
unordered_map<char, int> need, curr; for (char ch : p) need[ch]++;
int left = 0, right = 0; int curr_valid = 0, need_valid = need.size();
while (right < n) { char ch = s[right]; curr[ch]++;
if (curr[ch] == need[ch]) curr_valid++;
right++;
while (curr_valid == need_valid) { char ch = s[left]; if (right - left == p.size()) cout << left << ' ';
if (curr[ch] == need[ch]) curr_valid--; curr[ch]--; left++; } } }
|