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
相关产品推荐
相关产品推荐

