Overview
Given two strings s and p, return an array of all start indices of p's anagrams in s. An anagram uses all letters exactly.
Constraints
1 <= s.length, p.length <= 30,000- Both consist of lowercase English letters.
Examples
findAnagrams("cbaebabacd", "abc");
// => [0, 6] ("cba" at 0, "bac" at 6)
findAnagrams("abab", "ab");
// => [0, 1, 2]Solution
Reveal solution
function findAnagrams(s, p) {
const result = [];
const pCount = new Array(26).fill(0);
const sCount = new Array(26).fill(0);
const a = 'a'.charCodeAt(0);
for (const c of p) pCount[c.charCodeAt(0) - a]++;
for (let i = 0; i < s.length; i++) {
sCount[s.charCodeAt(i) - a]++;
if (i >= p.length) sCount[s.charCodeAt(i - p.length) - a]--;
if (sCount.every((v, j) => v === pCount[j])) result.push(i - p.length + 1);
}
return result;
}Resources
find-all-anagrams-in-string.js
Find All Anagrams in a String
mediumcodingAlgorithmsSliding Window
Overview
Given two strings s and p, return an array of all start indices of p's anagrams in s. An anagram uses all letters exactly.
Constraints
1 <= s.length, p.length <= 30,000- Both consist of lowercase English letters.
Examples
findAnagrams("cbaebabacd", "abc");
// => [0, 6] ("cba" at 0, "bac" at 6)
findAnagrams("abab", "ab");
// => [0, 1, 2]Solution
Reveal solution
function findAnagrams(s, p) {
const result = [];
const pCount = new Array(26).fill(0);
const sCount = new Array(26).fill(0);
const a = 'a'.charCodeAt(0);
for (const c of p) pCount[c.charCodeAt(0) - a]++;
for (let i = 0; i < s.length; i++) {
sCount[s.charCodeAt(i) - a]++;
if (i >= p.length) sCount[s.charCodeAt(i - p.length) - a]--;
if (sCount.every((v, j) => v === pCount[j])) result.push(i - p.length + 1);
}
return result;
}Resources
NameTopicDifficulty
103 of 103 problems