解题步骤及问题分析 | 豆包MarsCode AI 刷题

89 阅读2分钟

题目解析

思路

我们需要找到一个滑动窗口,其中包含至多两种不同的字母,并且通过修改最多 ( 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)