小黑代码
class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
# s1与s2的长度
n_s1 = len(s1)
n_s2 = len(s2)
# 非法情况
if n_s1 > n_s2:
return False
# 初始化差值向量
count = [0] * 26
# 判断初始状态是否成立
for i in range(n_s1):
count[ord(s1[i])-97] -= 1
count[ord(s2[i])-97] += 1
# 初始化差值
diff = [i != 0 for i in count].count(True)
# 初始窗口符合条件
if not diff:
return True
# 开始进行滑动窗口
for i in range(n_s2-n_s1):
# 将要滑出的字符是否影响diff
if count[ord(s2[i])-97] == 1:
diff -= 1
elif not count[ord(s2[i])-97]:
diff += 1
count[ord(s2[i])-97] -= 1
# 将要滑入的字符是否影响diff
if count[ord(s2[i+n_s1])-97] == -1:
diff -= 1
elif not count[ord(s2[i+n_s1])-97]:
diff += 1
count[ord(s2[i+n_s1])-97] += 1
if not diff:
return True
return False
双指针法
class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
# s1与s2长度
n_s1 = len(s1)
n_s2 = len(s2)
if n_s1 > n_s2:
return False
# 计算s1的每个字符个数
count = [0] * 26
for i in range(n_s1):
count[ord(s1[i])-97] += 1
# 定义双指针
left = 0
right = 0
while right < n_s2:
# 计数该字符
count[ord(s2[right])-97] -= 1
# 不断移动做指针,使得该字符的偏差大于等于0
while count[ord(s2[right])-97] < 0:
count[ord(s2[left])-97] += 1
left += 1
right += 1
if right - left == n_s1:
return True
return False
小黑生活
晚餐麻辣烫烤肠
王者峡谷,打得人家抬不起头
晚饭后和阿黄温榆河骑小黄车
以后可以继续学钢琴啦
晚上和阿黄老黑们小搞一下,中老黑遭遇情感危机
眼睛逐步恢复
早上没起来,直接午饭
给远在西安的大老黑寄党组织关系
回去打卡小汤3第5课
跟小老黑吃个老马拉面