题目解析
思路
我们需要找到一个滑动窗口,其中包含至多两种不同的字母,并且通过修改最多 ( k ) 次来使得该窗口内的字母都变成这两种字母之一。 滑动窗口的方法通常适用于“寻找最长满足条件的子串”这类问题。我们可以用一个双指针(或滑动窗口)来遍历字符串,并维护一个字母计数器来记录当前窗口内各个字母的频率。
解题步骤
- 初始化两个指针:left = 0,right = 0。
- 维护一个字典来记录当前窗口的字符频率。
- 用 right 指针不断向右移动,扩大窗口。
- 每次 right 向右移动时,检查窗口里的字符种类是否超过 2 种。
- 如果超过了 2 种字符,移动 left 指针缩小窗口,直到窗口内的不同字符数小于等于 2。
- 计算当前窗口的长度,如果需要修改的字符数不超过 ( k ),则更新结果。
知识总结
滑动窗口的操作
- 左右指针:你会用两个指针(通常是 left 和 right)表示窗口的左右边界,开始时这两个指针通常都指向数组的起始位置。
- 扩展窗口:首先你会将 right 指针向右扩展,也就是将更多的元素加入到当前窗口中。每扩展一次,窗口就会包含更多的元素。
- 收缩窗口:如果当前窗口不满足条件(比如窗口内的元素种类过多,或者满足某个条件的元素过少),你就会移动 left 指针,缩小窗口。这样可以去掉一些元素,让窗口重新满足条件。
学习计划
每天刷题,先从简单题做起,逐步深入,充分利用AI代码思路提示功能,提高刷题的效率
工具运用
- 利用反馈是否通过所有测试样例,并提供错误定位与修复建议的功能。
- 利用MarsCodeAI 提供详细的解答,包括算法分析、时间和空间复杂度分析等功能。
- 遇到解题困难,MarsCodeAI 会提供实时的解题提示。
- 利用MarsCodeAI的不同语言功能,找到适合自己的语言。
maxLength = 0
# 遍历所有可能的字母对 (target1, target2)
for target1 in range(ord('A'), ord('Z') + 1):
for target2 in range(ord('A'), ord('Z') + 1):
if target1 == target2:
continue
left, right = 0, 0
changes = 0
# 滑动窗口操作
while right < n:
# 如果当前字符不在 target1 和 target2 中,增加 changes
if inp[right] != chr(target1) and inp[right] != chr(target2):
changes += 1
# 如果 changes 超过 k,收缩左边界
while changes > k:
if inp[left] != chr(target1) and inp[left] != chr(target2):
changes -= 1
left += 1
# 更新 maxLength
maxLength = max(maxLength, right - left + 1)
right += 1
return maxLength
if __name__ == "__main__":
print(solution(6, 1, "ABCBAD") == 5)
print(solution(5, 1, "AEABD") == 4)
print(solution(8, 2, "AAAABBCD") == 8)