滑块思想:
(1) 先用字串p初始化 m(长度为256,值为0) , 因为char最多是256个;
(2) 注意滑动规则,p.size()范围内,如果right在 p里, m[ s[right]] 必定 >=1;
此时我们匹配的字符数目 cnt--, 并且把 m里去掉一个字符 s[right],然后再向右边滑动。
(3) 当 cnt = 0时,完全匹配上。
(4) 如果 left ~ right等于 p的长度了。那么需要left++。此时要注意left是否在 p中,如果在,有两种case:
(a) 此时完全匹配,m[s[left]]已经被减到0;
(b) 此时没有完全匹配, m[s[left]] 大于 0.
以上两种case需要,再找一个匹配的left,所以 cnt++。
vector<int> findAnagrams(string s, string p) {
if (s.empty()) return {};
vector<int> res, m(256, 0);
int left = 0, right = 0, cnt = p.size(), n = s.size();
for (char c : p) ++m[c];
while (right < n) {
if(m[s[right++]]-- >= 1)
--cnt;
if(cnt == 0)
res.push_back(left);
if(right-left==p.size() && m[s[left++]]++ >= 0)
++cnt;
}
return res;
}