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".
Python
class Solution(object): def findAnagrams(self, s, p): """ :type s: str :type p: str :rtype: List[int] """ result = [] if not s: return [] p_dict = dict() for _p in p: Solution.add_k_in_dict(_p, p_dict) s_dict = dict() index = 0 for _s in s[index: index + len(p)]: Solution.add_k_in_dict(_s, s_dict) if s_dict == p_dict: result.append(index) index += 1 while index+len(p) <= len(s): print index+len(p) Solution.del_k_from_dict(s[index-1], s_dict) Solution.add_k_in_dict(s[index+len(p)-1], s_dict) if s_dict == p_dict: result.append(index) index += 1 return result @classmethod def add_k_in_dict(cls, k, k_dict): if k in k_dict: k_dict[k] += 1 else: k_dict[k] = 1 @classmethod def del_k_from_dict(cls, k, k_dict): if k in k_dict: k_dict[k] -= 1 if k_dict[k] == 0: del k_dict[k]