給定兩個字串 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...