You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

最长重复子串替换问题代码报错求助:运行时错误排查

问题分析与代码修复

原代码的核心问题

  • k值未重置:每次外层循环移动左指针l时,没有将k恢复到初始输入值,导致第一次消耗完k后,后续循环中k始终为负数,直接跳过内部扩展逻辑。
  • s_counter未重置:s_counter在每次循环l时持续累加,无法正确统计当前窗口的实际长度。
  • 算法逻辑错误:原思路是固定左指针后仅扩展到k用完就停止,但正确解法应该采用滑动窗口,通过维护窗口内字符的频率动态调整左右指针,确保窗口长度 - 窗口内最多重复字符数 ≤ k,才能找到全局最长的合法子串。

修复后的代码

class Solution:
    def characterReplacement(self, s: str, k: int) -> int:
        freq = {}
        max_freq = 0
        left = 0
        max_length = 0
        
        for right in range(len(s)):
            # 更新当前字符的出现频率
            freq[s[right]] = freq.get(s[right], 0) + 1
            max_freq = max(max_freq, freq[s[right]])
            
            # 当需要替换的字符数超过k时,移动左指针缩小窗口
            while (right - left + 1) - max_freq > k:
                freq[s[left]] -= 1
                left += 1
            
            # 更新全局最长合法子串长度
            max_length = max(max_length, right - left + 1)
        
        return max_length

代码解释

  • 滑动窗口逻辑:用左右指针维护一个动态窗口,右指针持续向右扩展,实时统计窗口内每个字符的出现频率。
  • 频率校验:记录窗口内出现次数最多的字符频率max_freq,窗口长度减去该值即为需要替换的字符数;若该值超过k,则移动左指针缩小窗口,直到满足替换条件。
  • 结果更新:每次扩展右指针后,检查当前窗口长度是否为全局最长,更新结果值。

测试验证

  • 输入s="AABCCA", k=2:窗口可扩展至AABC(长度4,需替换2个字符),最终返回4,符合预期。
  • 输入s="AABCCA", k=1:最长合法窗口为AAB或BCC(长度3),返回结果与预期一致。

内容的提问来源于stack exchange,提问作者EdAlex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:57:14