1. 程式人生 > >LeetCode--438. Find All Anagrams in a String(找到所有字元組合)Python

LeetCode--438. Find All Anagrams in a String(找到所有字元組合)Python

題目:

給定兩個字串s、p。找到s中和p包含相同字元的所有子串。

解題思路:

直接暴力搜尋s,固定長度,對p和s固定長度的子串分別進行排序,看兩者排序後是否相同。這樣是一種方法,但會超時。

另外一種方法是使用雜湊的方法。用兩個個1*26的list分別儲存p和s子串中各個字元出現的字數,對s進行滑動視窗,保持子串長度為p的長度。這樣複雜度為O(n)。

程式碼(Python):

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        if len(s)<len(p):
            return []
        Dict = {}
        for i in range(26):
            Dict[chr(ord('a')+i)] = i
        
        p_char = [0]*26
        for i in p:
            p_char[Dict[i]] = p_char[Dict[i]]+1
        
        s_char = [0]*26
        n_p = len(p)
        n_s = len(s)
        
        output = []
        
        for i in range(n_p):
            s_char[Dict[s[i]]] = s_char[Dict[s[i]]]+1
            if s_char==p_char:
                output.append(0)
                
        for i in range(1,n_s-n_p+1):
            s_char[Dict[s[i-1]]] = s_char[Dict[s[i-1]]]-1
            s_char[Dict[s[i+n_p-1]]] = s_char[Dict[s[i+n_p-1]]]+1
            if s_char==p_char:
                output.append(i)
        return output