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

