【LeetCode 簡單題】98-找到字串中所有字母異位詞
阿新 • • 發佈:2018-11-16
宣告:
今天是第98道題。給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:給定一個字串 s 和一個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文字母,並且字串 s
說明:
- 字母異位詞指字母相同,但排列不同的字串。
- 不考慮答案輸出的順序。
示例 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