大家好,我是毛毛。ヾ(´∀ ˋ)ノ
那就開始今天的解題吧~
Given two strings s1
and s2
, return true if s2
contains a permutation of s1
, or false
otherwise.
In other words, return true
if one of s1
's permutations is the substring of s2
.
Example 1:
Input: s1 = "ab", s2 = "eidbaooo"
Output: true
Explanation: s2 contains one permutation of s1 ("ba").
Example 2:
Input: s1 = "ab", s2 = "eidboaoo"
Output: false
Constraints:
1 <= s1.length, s2.length <= 10^4
s1
and s2
consist of lowercase English letters.給兩個string(s1
&s2
),如果s1
的所有排列組合中有出現在s2
中,救回傳True
;如果沒有,則回傳否。
s1_dict
與s2_dict
~
s2
從index: 0
開始到跟s1
一樣長度的substrings1_dict
和s2_dict
中有哪些字母的出現頻率是一樣的~有的話,check+1
check
是不是26,因為有可能第一個s2
的window中就出現s1
的其中一種排列組合。因為ptr
為0的時候,已經先處理完了,所以while每次的第一行就先移動ptr
到下一格(移動window)。
MINUS Part:
ptr
的字母一定會不見,所以s2_dict
先把前一個的ptr
的字母的出現頻率-1
s1_dict
和s2_dict
中ptr-1
的字母的出現頻率是否相同,相同的話,check+1
s1_dict
和s2_dict
中ptr-1
的字母的出現頻率是否相同,相同的話,check-1
;不同的話,因為本來check
就減過就不用管他了~PLUS Part:
ptr+len(s1)
的字母,所以s2_dict
先把ptr+len(s1)
的字母的出現頻率+1
s1_dict
和s2_dict
中ptr-1
的字母的出現頻率是否相同,相同的話,check+1
s1_dict
和s2_dict
中ptr-1
的字母的出現頻率是否相同,相同的話,check-1
;不同的話,因為本來check
就減過就不用管他了~Return Part:
check
是26,表示這次s2
的window是s1
的排列組合,回傳True
。ptr+len(s1)
已經大於len(s2)
,表示已經跑完啦~False
~class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
ptr = 0
s1_dict = {}
s2_dict = {}
check = 0
if len(s1) > len(s2):
return False
for index in range(len(s1)):
s1_dict[s1[index]] = 1 + s1_dict.get(s1[index], 0)
s2_dict[s2[ptr+index]] = 1 + s2_dict.get(s2[ptr+index], 0)
# init check
for letter in range(ord('a'), ord('z') + 1):
if s1_dict.get(chr(letter), 0) == s2_dict.get(chr(letter), 0):
check += 1
# print("Init Check: ", check)
if check == 26:
return True
while ptr+len(s1) < len(s2):
ptr += 1
# print("Window: ", s2[ptr:ptr+len(s1)])
# MINUS previous ptr
s2_dict[s2[ptr-1]] -= 1
# 如果刪掉前一個s2[ptr]後,s2[ptr]在這個window中跟在s1中s2[ptr]這個字母的出現頻率一樣
# 就把check+1,表示這個字母在s1跟s2出現頻率一樣
if s1_dict.get(s2[ptr-1], 0) == s2_dict[s2[ptr-1]]:
check += 1
else:
if s1_dict.get(s2[ptr-1], 0) == s2_dict[s2[ptr-1]] + 1:
check -= 1
# print("After minus => \ns2_dict: ", s2_dict)
# print("Check: ", check, "\n")
# PLUS ptr+len(s2)
s2_dict[s2[ptr+len(s1)-1]] = 1 + s2_dict.get(s2[ptr+len(s1)-1], 0)
if s1_dict.get(s2[ptr+len(s1)-1], 0) == s2_dict.get(s2[ptr+len(s1)-1], 0):
check += 1
else:
if s1_dict.get(s2[ptr+len(s1)-1], 0) == s2_dict[s2[ptr+len(s1)-1]] - 1:
check -= 1
# print("After plus => \ns2_dict: ", s2_dict)
# print("Check: ", check, "\n\n\n")
if check == 26:
return True
return False
今天就到這邊啦~
大家明天見