438. 找到字符串中所有字母異位詞
https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
題目:
給定一個字符串s和一個非空字符串p,找到s中所有是p的字母異位詞的子串,返回這些子串的起始索引。
字符串只包含小寫英文字母,并且字符串s和 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" 的字母異位詞。
分析:
如果做過類似題目,會第一時間想到雙指針+字典的方式進行順序比較。
- 維護一個ascii_lowercase為key的全零字典
- 根據(jù)p生成待匹配的字典信息dict_p
- 同理創(chuàng)建針對s的ascii_lowercase為key的全零字典
- 創(chuàng)建雙指針,right從s[0]出發(fā)每次添加至tmp字典
- 當(dāng)左右指針差距小于len(p)時,left指針不動
- 當(dāng)左右指針差距等于len(p)時開始正式的對比操作,并每次匹配后left+=1
- 如果tmp等于dict_p,則將left指針添加入ret。
- 如果不匹配,刪除掉左指針對應(yīng)的字母。
- right+=1
- 當(dāng)right指針走至s末尾結(jié)束判斷。
解題:
from string import ascii_lowercase
class Solution:
def findAnagrams(self, s, p):
ret = []
k_dict = {}.fromkeys(ascii_lowercase, 0)
for i in p:
k_dict[i] += 1
tmp = {}.fromkeys(ascii_lowercase, 0)
left = right = 0
while right < len(s):
tmp[s[right]] += 1
if tmp == k_dict:
ret.append(left)
if right - left + 1 == len(p):
tmp[s[left]] -= 1
left += 1
right += 1
return ret
歡迎關(guān)注我的公眾號: 清風(fēng)Python,帶你每日學(xué)習(xí)Python算法刷題的同時,了解更多python小知識。
有喜歡力扣刷題的小伙伴可以加我微信(King_Uranus)互相鼓勵,共同進步,一起玩轉(zhuǎn)超級碼力!
我的個人博客:https://qingfengpython.cn