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".
class Solution(object):
def findAnagrams(self, s, p):
lp = len(p)
ls = len(s)
ds = {}
dp = {}
for i in s[:lp]:
ds[i] = ds.get(i,0) + 1
for i in p[:lp]:
dp[i] = dp.get(i,0) + 1
res = []
i = 0
while i < (ls-lp):
if dp == ds:
res += i,
ds[s[i]] -= 1
if ds[s[i]] == 0:
del ds[s[i]]
ds[s[i+lp]] = ds.get(s[i+lp],0) + 1
i+= 1
if ds == dp:
res += i,
return res
"""
:type s: str
:type p: str
:rtype: List[int]
"""