class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
# sliding window
cnt = Counter(s1)
width = len(s1) # s1的长度 作为维护s2的滑动窗口
for i in range(len(s2)):
if s2[i] in cnt:
cnt[s2[i]] -= 1
# 这个条件检查当前索引 i 是否至少等于 s1 的长度(即变量 width)。
# 当 i 等于或大于 width 时,意味着滑动窗口已经完全覆盖了 s1 的长度,可以开始从窗口的左侧移除字符了
# 这个条件检查即将从窗口中移除的字符(s2[i - width])是否是 s1 中的字符。
# 如果是,我们需要将该字符的计数在 cnt 中增加回来,因为我们正在将这个字符从当前的窗口中移除
if i >= width and s2[i - width] in cnt:
cnt[s2[i - width]] += 1
if all(cnt[i]==0 for i in cnt):
return True
return False
424. Longest Repeating Character Replacement
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
# sliding window
count = {}
max_len = 0
max_count = 0
left = 0
for right in range(len(s)):
count[s[right]] = count.get(s[right], 0) + 1
max_count = max(max_count, count[s[right]])#refresh the max count in the window
# 如果需要替换的字符数超过k,则收缩窗口
if right - left + 1 - max_count > k:
count[s[left]] -= 1
left += 1
max_len = max(max_len, right - left + 1)
return max_len
'''
right - left + 1:窗口的总长度,表示窗口中包含的字符数。
max_count:窗口内出现次数最多的字符的出现次数。
(right - left + 1) - max_count:窗口内除了最多字符以外的字符数量,这些字符就是我们可能需要替换的字符。
'''