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

Valid Palindrome II问题:两次代码差异致测试结果不同的原因咨询

问题:判断删除至多一个字符后字符串是否为回文的代码逻辑差异分析

给定字符串s,判断删除至多一个字符后,该字符串是否能成为回文。

最初的代码实现无法通过所有测试用例:

class Solution:
    def validPalindrome(self, s: str) -> bool:
        if s==s[::-1]: 
            return True
        left, right=0, len(s)-1
        while left < right:
            if s[left]==s[right]:
                left+=1
                right-=1
            else:
                s1=s[0:left]+s[left+1:]
                s2=s[:right]+s[right+1:]
                if (s1!=s1[::-1]) or (s2!=s2[::-1]):
                    return False
                else: return True
        return True          

修改一处判断逻辑后即可通过所有测试用例:

class Solution:
    def validPalindrome(self, s: str) -> bool:
        if s==s[::-1]: 
            return True
        left, right=0, len(s)-1
        while left < right:
            if s[left]==s[right]:
                left+=1
                right-=1
            else:
                s1=s[0:left]+s[left+1:]
                s2=s[:right]+s[right+1:]
                if (s1==s1[::-1]) or (s2==s2[::-1]):
                    return True
                else: return False
        return True             

逻辑差异的原因

你最初的代码完全搞反了核心判断逻辑:

当左右指针指向的字符不相等时,我们需要验证删除左指针字符后的字符串s1,或删除右指针字符后的字符串s2,是否至少有一个是回文——只要满足其中一个,就说明符合题目要求(删至多一个字符能得到回文),应该返回True;只有当s1和s2都不是回文时,才返回False。

但最初的代码写的是:如果s1不是回文 或者 s2不是回文,就返回False。这会导致只要其中一个字符串不是回文,就直接错误返回False,哪怕另一个是回文。比如拿字符串"abcb"举例:

  • 左指针在0(字符'a'),右指针在3(字符'b'),两者不相等;
  • s1是删除左指针字符后的"bcb"(是回文),s2是删除右指针字符后的"abc"(不是回文);
  • 初始代码的判断条件(s1!=s1[::-1]) or (s2!=s2[::-1]) 结果为 False or True = True,因此执行return False,但实际上这个字符串符合要求,应该返回True,这就导致了测试用例失败。

修改后的代码把判断条件调整为只要s1是回文 或者 s2是回文,就返回True,否则返回False。这完全符合题目需求:只要两种删除方式中有一种能得到回文,就满足条件;只有两种方式都不行时,才判定为不符合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:58:11