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]

发表评论