最长重复子串替换问题代码报错求助:运行时错误排查
问题分析与代码修复
原代码的核心问题
- 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
相关产品推荐
相关产品推荐

