这个题解采用了滑动窗口的方法来判断s2是否包含s1的某个变位词作为子串。首先,通过一个长度为26的数组s1_count来统计s1中每个字符的出现次数。数组的索引对应从'a'到'z'的每个字符。接着,使用同样的方式,通过另一个长度为26的数组s2_count来动态地在s2上维护一个长度为s1长度的滑动窗口的字符出现次数。随着窗口在s2上从左到右滑动,检查当前窗口内的字符分布是否与s1相同。如果在任何时刻两个数组相等,说明s2中存在一个子串是s1的变位词,返回True。如果遍历完s2后没有找到任何匹配,返回False。
时间复杂度: O(m)
空间复杂度: O(1)
class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
n, m = len(s1), len(s2)
s1_count = [0] * 26 # 存储s1中每个字符的出现次数
s2_count = [0] * 26 # 存储当前s2的滑动窗口中的字符出现次数
for i in range(n):
s1_count[ord(s1[i]) - ord('a')] += 1 # 初始化s1的字符计数
for right in range(m):
cur_right = ord(s2[right]) - ord('a')
s2_count[cur_right] += 1 # 将当前字符加入滑动窗口
if s2_count == s1_count:
return True # 如果当前窗口的字符计数与s1相同,则找到一种排列
if right - n + 1 >= 0:
s2_count[ord(s2[right-n+1]) - ord('a')] -= 1 # 移动窗口,去除最左侧字符的计数
return False