【題目】
給定乙個字串 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...