雜湊 中等 438 找到字串中所有字母異位詞

2021-10-22 16:28:51 字數 3207 閱讀 4405

【題目】

給定乙個字串 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」 的字母異位詞。

這個評判系統也是蠻神奇的,昨天還可以通過,今天就是超時了。。。

class

solution

:def

findanagrams

(self, s:

str, p:

str)

-> list[

int]

: s+=

"," p=

"".join(

sorted

(list

(p))

) pos=

0 ans=

for index,c in

enumerate

(s):

if index-pos==

len(p):if

"".join(

sorted

(list

(s[pos:index]))

)==p:

pos+=

1return ans

【滑動視窗+陣列】

因為字串中的字元全是小寫字母,可以用長度為26的陣列記錄字母出現的次數

設n = len(s), m = len§。

記錄p字串的字母頻次p_cnt,和s字串前m個字母頻次s_cnt

若p_cnt和s_cnt相等,則找到第乙個異位詞索引 0

繼續遍歷s字串索引為[m, n)的字母,在s_cnt中每次增加乙個新字母,去除乙個舊字母

判斷p_cnt和s_cnt是否相等,相等則在返回值res中新增異位詞索引 i - m + 1

class

solution

:def

findanagrams

(self, s:

str, p:

str)

-> list[

int]

: len_s,len_p,ans,p_cnt,s_cnt=

len(s)

,len

(p),

,[0]

*26,[

0]*26

if len_s

return ans

for i in

range

(len_p)

: p_cnt[

ord(p[i])-

ord(

'a')]+=

1 s_cnt[

ord(s[i])-

ord(

'a')]+=

1if p_cnt==s_cnt:0)

for i in

range

(len_p,len_s)

: s_cnt[

ord(s[i])-

ord(

'a')]+=

1 s_cnt[

ord(s[i-len_p])-

ord(

'a')]-=

1if s_cnt==p_cnt:1)

return ans

【滑動視窗+雙指標】

438 找到字串中所有字母異位詞

給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...

Leetcode438 找到字串中所有字母異位詞

給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...

438 找到字串中所有字母異位詞

給定乙個字串 s 和乙個非空字串 p,找到 s 中所有是 p 的字母異位詞的子串,返回這些子串的起始索引。字串只包含小寫英文本母,並且字串 s 和 p 的長度都不超過 20100。說明 字母異位詞指字母相同,但排列不同的字串。不考慮答案輸出的順序。示例 1 輸入 s cbaebabacd p abc...