-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfindAllAnagramsInString.js
More file actions
63 lines (51 loc) · 1.82 KB
/
findAllAnagramsInString.js
File metadata and controls
63 lines (51 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.
// Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.
// The order of output does not matter.
// Example 1:
// Input:
// s: "cbaebabacd" p: "abc"
// Output:
// [0, 6]
// Explanation:
// The substring with start index = 0 is "cba", which is an anagram of "abc".
// The substring with start index = 6 is "bac", which is an anagram of "abc".
// Example 2:
// Input:
// s: "abab" p: "ab"
// Output:
// [0, 1, 2]
// Explanation:
// The substring with start index = 0 is "ab", which is an anagram of "ab".
// The substring with start index = 1 is "ba", which is an anagram of "ab".
// The substring with start index = 2 is "ab", which is an anagram of "ab".
const findAllAnagramsInString = (str, p) => {
const map = new Map();
let count = 0, start = 0, end = 0;
const res = [];
// make map of number of instances of each letter
p.split('').forEach(val => {
!map.has(val) ? map.set(val, 1) : map.set(val, map.get(val) + 1)
});
count = map.size;
while (end < str.length) {
let endChr = str[end];
if (map.has(endChr)) {
map.set(endChr, map.get(endChr) - 1);
if (map.get(endChr) === 0) count--;
}
end++;
while (count === 0) {
let startChar = str[start];
if (map.has(startChar)) {
map.set(startChar, map.get(startChar) + 1);
if (map.get(startChar) > 0) count++
}
if (end - start === p.length) res.push(start);
start++;
}
}
return res;
}
console.log(findAllAnagramsInString("cbaebabacd", "abc"))
console.log(findAllAnagramsInString("abab", "ab"))
module.exports = findAllAnagramsInString;