没有注释的代码如下:
import collections
class Solution(object):
def checkInclusion(self, s1, s2):
counter1 = collections.Counter(s1)
N = len(s2)
left = 0
right = len(s1) - 1
counter2 = collections.Counter(s2[0:right])
while right < N:
counter2[s2[right]] += 1
if counter1 == counter2:
return True
counter2[s2[left]] -= 1
if counter2[s2[left]] == 0:
del counter2[s2[left]]
left += 1
right += 1
return False
s1 = input()
s2 = input()
s = Solution()
print(s.checkInclusion(s1,s2))
有注释的代码如下:
import collections
class Solution(object):
def checkInclusion(self, s1, s2):
# 统计 s1 中每个字符出现的次数
counter1 = collections.Counter(s1)
N = len(s2)
# 定义滑动窗口的范围是 [left, right],闭区间,长度与s1相等
left = 0
right = len(s1) - 1
# 统计窗口s2[left, right - 1]内的元素出现的次数
counter2 = collections.Counter(s2[0:right])
while right < N:
# 把 right 位置的元素放到 counter2 中,即:把 right 位置元素放入窗口中
counter2[s2[right]] += 1
# 如果滑动窗口内各个元素出现的次数跟 s1 的元素出现次数完全一致,返回 True
if counter1 == counter2:
return True
# 窗口向右移动前,把当前 left 位置的元素出现次数 - 1,即 从窗口中弹出 left位置的元素
counter2[s2[left]] -= 1
# 如果当前 left 位置的元素出现次数为 0, 需要从字典中删除,否则这个出现次数为 0 的元素会影响两 counter 之间的比较
# 次数为 0 的元素必须要删除掉,不然 counter2 中就会有一个元素 c:0,这个 元素是 counter1 中没有的,counter1中的元素的次数value都是大于0的,不删除这个次数为0的元素,就会让 counter1永远不等于 counter2
if counter2[s2[left]] == 0:
del counter2[s2[left]]
# 窗口向右移动
left += 1
right += 1
return False
s1 = input()
s2 = input()
s = Solution()
print(s.checkInclusion(s1,s2))