Skip to main content

438.js

/** ------------------------------------------------------------------------------
*
* 2023-02-05
* 438. Find All Anagrams in a String
* https://leetcode.com/problems/find-all-anagrams-in-a-string/
*
------------------------------------------------------------------------------ */
/**
* @param {string} s
* @param {string} p
* @return {number[]}
*/
var findAnagrams = function (s, p) {
if (p.length > s.length) return [];
const output = [];

const map = new Map();

for (let i = 0; i < p.length; i++) {
const character = p[i];
if (map.has(character)) {
map.set(character, map.get(character) + 1);
} else {
map.set(character, 1);
}
}

for (let i = 0; i <= s.length - p.length; i++) {
if (output[output.length - 1] === i - 1 && s[i - 1] === s[i + p.length - 1]) {
output.push(i);
continue;
}
const newMap = new Map(map);
for (let j = i + p.length - 1; j >= i; j--) {
const character = s[j];
if (!newMap.has(character)) {
i = j;
break;
} else if (newMap.get(character) !== 1) {
newMap.set(character, newMap.get(character) - 1);
} else {
newMap.delete(character);
}
}
if (!newMap.size) {
output.push(i);
}
}

return output;
};

console.log(findAnagrams("cbaebabacd", "abc"));