leetcode 字串的排列 python3

2021-10-24 17:11:15 字數 2147 閱讀 7625

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。

換句話說,第乙個字串的排列之一是第二個字串的子串。

示例1

:輸入: s1 =

"ab" s2 =

"eidbaooo"

輸出:true

解釋: s2 包含 s1 的排列之一 (

"ba").

示例2:輸入: s1=

"ab" s2 =

"eidboaoo"

輸出:false

注意:

輸入的字串只包含小寫字母

兩個字串的長度都在 [1, 10,000] 之間

1 初始化滑動視窗,其長度為s1的長度

2 只需要判斷滑動視窗中字母出現的頻率是否與s1相同即可

3 利用雜湊表儲存s1中字母出現的頻率,利用count總計數判斷是否已經匹配

4 不斷滑動視窗,分別對離開視窗和進入視窗的字母進行雜湊表加減操作和count加減操作。

class

solution

:def

checkinclusion

(self, s1:

str, s2:

str)

->

bool:if

len(s1)

>

len(s2)

:return

false

dic_1 =

dic_2 =

for i in s1:

dic_1[i]+=1

for j in

range

(len

(s2)):

dic_2[s2[j]]+=

1if j >=

len(s1)

: dic_2[s2[j-

len(s1)]]

-=1if dic_1 == dic_2:

return

true

return

false

class

solution

:def

checkinclusion

(self, s1:

str, s2:

str)

->

bool

: len_1, len_2 =

len(s1)

,len

(s2)

if len_1 > len_2:

return

false

char_count_1 =[0

for i in

range(26

)]char_count_2 = char_count_1.copy(

) ascii_a =

ord(

'a')

for i in

range

(len_1)

: char_count_1[

ord(s1[i]

)- ascii_a]+=1

char_count_2[

ord(s2[i]

)- ascii_a]+=1

for i in

range

(len_1, len_2)

:if self.isequal(char_count_1, char_count_2)

:return

true

char_count_2[

ord(s2[i - len_1]

)- ascii_a]-=1

char_count_2[

ord(s2[i]

)- ascii_a]+=1

return self.isequal(char_count_1, char_count_2)

defisequal

(self, char_count_1, char_count_2)

:for i in

range(26

):if char_count_1 != char_count_2:

return

false

return

true

leetcode字串的排列

1.暴力法 求出s1的全排列,然後判斷s2中是否包含s1的排列之一 如下 class solution for int i start i s.size i 結果,超時 2.滑動視窗 維護乙個大小為s1.size 的視窗,使用hashmap1記錄字串s1內的字元情況,hashmap2記錄字串s2中滑...

leetcode 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba 限制 1 s 的長度 8 std vector string permutation std string s 對字串進行...

LeetCode 字串的排列(滑動視窗)

給定兩個字串 s1 和 s2,寫乙個函式來判斷 s2 是否包含 s1 的排列。換句話說,第乙個字串的排列之一是第二個字串的子串。示例1 輸入 s1 ab s2 eidbaooo 輸出 true 解釋 s2 包含 s1 的排列之一 ba 示例2 輸入 s1 ab s2 eidboaoo 輸出 fals...