Find All Anagrams in a String
Problem Statement
Given two strings s and p, return an array of all the start indices of p's anagrams in s. You may return the answer in any order.
An Anagram is a word or phrase formed by rearranging the letters of a different word or phrase, typically using all the original letters exactly once.
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".
Constraints:
1 <= s.length
,p.length
<=
3 * 104- s and p consist of lowercase English letters.
Code
Python Code
class Solution(object):
def findAnagrams(self, s: str, p: str) -> List[int]:
hm, res, pL, sL = defaultdict(int), [], len(p), len(s)
if pL > sL: return []
# build hashmap
for ch in p: hm[ch] += 1
# initial full pass over the window
for i in range(pL-1):
if s[i] in hm: hm[s[i]] -= 1
# slide the window with stride 1
for i in range(-1, sL-pL+1):
if i > -1 and s[i] in hm:
hm[s[i]] += 1
if i+pL < sL and s[i+pL] in hm:
hm[s[i+pL]] -= 1
# check whether we encountered an anagram
if all(v == 0 for v in hm.values()):
res.append(i+1)
return res