/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
const findAnagrams = function (s, p) {
const slen = s.length, plen = p.length, res = [], pmap = {};
let begin = 0, end = 0;
for (let i = 0; i < plen; ++i) {
if (pmap[p[i]] > 0) {
++pmap[p[i]];
} else {
pmap[p[i]] = 1;
}
}
// console.log(pmap);
let count = Object.keys(pmap).length;
while (end < slen) {
// if (pmap[s[end]] >= 0) { // 如果 pmap 中包含 s[begin]
if (s[end] in pmap) { // 如果 pmap 中包含 s[begin]
--pmap[s[end]];
if (pmap[s[end]] === 0) {
--count;
}
}
++end;
while (count === 0) {
// if (pmap[s[begin]] >= 0) { // 如果 pmap 中包含 s[begin]
if (s[begin] in pmap) { // 如果 pmap 中包含 s[begin]
if (pmap[s[begin]] === 0) {
++count;
}
++pmap[s[begin]]
// if (pmap[s[begin]] > 0) {
// ++count;
// }
}
if (end - begin === plen) {
res.push(begin);
}
++begin;
}
}
// console.log(res);
return res;
};
// const eq = function (a, b_sort) {
// const a_sort = a.split('').sort(function (aa, bb) { return aa.localeCompare(bb) }).join('')
// return a_sort === b_sort;
// }
findAnagrams("aa", "bb")
findAnagrams("cbaebabacd", "abc")
findAnagrams("abab", "ab")
findAnagrams("abacbabc", "abc")
这里有一个很棒的关于 leetcode 用到了滑动窗口的题的总结 https://leetcode.com/problems/find-all-anagrams-in-a-string/discuss/92007/Sliding-Window-algorithm-template-to-solve-all-the-Leetcode-substring-search-problem.