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

LeetCode 680:验证回文字符串Ⅱ代码报错问题排查

问题排查:LeetCode 680 验证回文字符串Ⅱ代码错误分析

核心问题

你的代码在遇到左右字符不匹配时,仅尝试了单一的跳过方向(要么跳左,要么跳右),但没有考虑两种跳过方向都需要验证的场景。

以'cuppucu'为例:

  • 初始l=0('c')、r=6('u')不相等,代码发现s[l+1] == s[r]('u' == 'u'),于是选择跳过左字符,l变为1,skip=1。
  • 后续走到l=2('p')、r=5('c')时,两者不相等且已用完跳过次数,直接返回false。但实际上,此时如果选择跳过右字符(r=6的'u'),剩余字符串'cuppuc'是合法回文,应该返回true。

长测试用例的问题本质相同:代码优先选择了某一种跳过方向,但该方向后续会出现不匹配,而另一种跳过方向才是正确路径,但代码没有去验证。

修复方案

当遇到第一次不匹配时,需要分别验证两种可能的分支:跳过左字符后的子串是否为回文,或者跳过右字符后的子串是否为回文。只要其中一个分支成立,就返回true。

可以拆分出辅助函数简化逻辑:

class Solution:
    def validPalindrome(self, s: str) -> bool:
        def is_palindrome(l, r):
            while l < r:
                if s[l] != s[r]:
                    return False
                l += 1
                r -= 1
            return True
        
        l, r = 0, len(s) - 1
        while l < r:
            if s[l] == s[r]:
                l += 1
                r -= 1
            else:
                # 同时检查两种跳过情况
                return is_palindrome(l + 1, r) or is_palindrome(l, r - 1)
        return True

修复说明

  • 辅助函数is_palindrome(l, r)负责检查索引l到r的子串是否为回文,逻辑简洁直接。
  • 当首次遇到字符不匹配时,不再硬选某一种跳过方式,而是同时验证两种可能路径,只要其中一条路径合法就返回true。
  • 这种方式覆盖了所有合法场景,不会因为优先选择错误的跳过方向而漏判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:35:25