problem:https://leetcode.com/problems/find-all-anagrams-in-a-string
主要思路是维护两个hashmap,一个记录期望出现的字符,一个记录当前出现的字符。
当前出现的字符随着窗口滚动不停更新,每次移动窗口后,都判断当前窗口是否满足条件。同时维护一个满足条件的count变量,通过比较当前出现字符和期望出现字符的个数来更新,当count等于期望字符串的长度时,意味着当前窗口满足条件。
class Solution { public: vector<int> findAnagrams(string s, string p) { unordered_map<int, int> expect; unordered_map<int, int> cur; int n = s.size(); int k = p.size(); for (int i = 0; i < k; i++) { expect[p[i]]++; } int count = 0; vector<int> res; for (int i = 0; i < n; i++) { // insert cur[s[i]]++; if (expect.find(s[i]) != expect.end() && cur[s[i]] <= expect[s[i]]) { count++; } // erase if (i >= k) { if (expect.find(s[i - k]) != expect.end() && cur[s[i - k]] <= expect[s[i - k]]) { count--; } cur[s[i - k]]--; if (cur[s[i - k]] == 0) { cur.erase(s[i - k]); } } // check valid if (k == count) { res.push_back(i - k + 1); } } return res; } };