给定两个字符串 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 = {k:0 for k in string.ascii_lowercase}
dic_2 = {k:0 for k in string.ascii_lowercase}
for i in s1:
dic_1[i] += 1
for j in range(len(s2)):
dic_2[s2[j]] += 1
if j >= len(s1):
dic_2[s2[j-len(s1)]] -= 1
if 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)
def isEqual(self, char_count_1, char_count_2):
for i in range(26):
if char_count_1 != char_count_2:
return False
return True