1. 程式人生 > >【LeetCode 簡單題】98-找到字串中所有字母異位詞

【LeetCode 簡單題】98-找到字串中所有字母異位詞

宣告:

今天是第98道題。給定一個字串 和一個非空字串 p,找到 中所有是 的字母異位詞的子串,返回這些子串的起始索引。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個字串 和一個非空字串 p,找到 中所有是 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文字母,並且字串 

和 的長度都不超過 20100。

說明:

  • 字母異位詞指字母相同,但排列不同的字串。
  • 不考慮答案輸出的順序。

示例 1:

輸入:
s: "cbaebabacd" p: "abc"

輸出:
[0, 6]

解釋:
起始索引等於 0 的子串是 "cba", 它是 "abc" 的字母異位詞。
起始索引等於 6 的子串是 "bac", 它是 "abc" 的字母異位詞。

 示例 2:

輸入:
s: "abab" p: "ab"

輸出:
[0, 1, 2]

解釋:
起始索引等於 0 的子串是 "ab", 它是 "ab" 的字母異位詞。
起始索引等於 1 的子串是 "ba", 它是 "ab" 的字母異位詞。
起始索引等於 2 的子串是 "ab", 它是 "ab" 的字母異位詞。

解法1。下面演算法的時間複雜度是o(n^2)級別的(pChar == sChar要花費O(n)的時間),思想就是用字典pChar儲存p中元素及其頻數,sChar儲存按序遍歷s中和p中元素個數一致的元素及其頻數,比較兩者是否一致,如果一致就將起始index放到res中,最後返回res,程式碼如下。

執行用時: 240 ms, 在Find All Anagrams in a String的Python提交中擊敗了35.03% 的使用者

class Solution(object):
    def findAnagrams(self, s, p):
        """
        :type s: str
        :type p: str
        :rtype: List[int]
        """
        from collections import Counter
        res = []
        s_len = len(s)
        p_len = len(p)
        sChar = Counter()    # 初始化為空,用於後續遍歷元素存取
        pChar = Counter(p)

        for i in range(s_len):
            sChar[s[i]] += 1
            if i >= p_len:    # 通過下面這段邏輯來控制sChar裡元素個數和pChar裡的保持一致
                sChar[s[i-p_len]] -= 0
                if sChar[s[i-p_len]]:
                    del sChar[s[i-p_len]]
            if pChar == sChar:
                res.append(i-p_len+1)    # 關鍵之一在於用i-p_len+1來表示索引
        return res      

 解法2。

 

結尾

解法1:https://blog.csdn.net/qq_17550379/article/details/80550907