【滑动窗口与双指针】【定长滑窗】—1456. 定长子串中元音的最大数目
滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
定长滑窗三步套路
1、入(第一个窗口)
先让右端点从 0 走到 k-1,把初始 k 个元素一次性统计完,并立即更新一次答案。
2、滑(剩余窗口)
右端点继续从 k 走到 n-1,每次循环只做三件事,顺序可互换:
a) 入:新元素 s[i] 进窗 → 更新统计量;
b) 出:旧元素 s[i-k] 出窗 → 更新统计量;
c) 更新:用最新统计量刷新全局答案,必要时提前剪枝 return。
循环结束后把最终答案抛回即可。
核心套路 3×1 口诀
入:先铺好第一个窗口
滑:右边进、左边出
更新:每一步都刷新最值
class Solution:def maxVowels(self, s: str, k: int) -> int:# “定长滑窗”套路本身就天然覆盖了所有 k 值,无需再写“边界”情况current_num = 0alphabet = set('aeiou')# 首先遍历 k 个窗口for i in range(k):if s[i] in alphabet:current_num += 1max_num = current_num# 遵循先入后出的步骤for i in range(k,len(s)):# 先入if s[i] in alphabet:current_num += 1# 后出 左端点 = i-k 因为在上一步添加了新元素 i 已经 +1if s[i-k] in alphabet:current_num -= 1if current_num > max_num:max_num = current_num# 优化:如果 max_num == k return if max_num == k:return max_numreturn max_num
常见坑点 Top5
- 忘记先统计第一个窗口
- 出窗时下标写成 i-k+1
- 把 set 写成 list 导致超时
- 窗口长度 != k
- 提前 return 漏掉全局最值
心路历程
最初参考了灵茶山艾府提出的定长滑动窗口思路【见参考】,但在此基础上,AI 推导出的新方法在理解上更加直观,因此最终采用了新的思路进行实现。
参考
Leetcode 灵茶山艾府 的定长滑窗解题套路