1. 读懂题目
2. 分析,推导解法,产生思路。
解题思路:双指针;最多可删除一次则出现不一致时,需要判断两种删除方式后是否为回文字符串;
3. 代码实现
代码一:解答错误;通过465/472;
class Solution(object):
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
l, r = 0, len(s)-1
del_num = 0
while l < r and del_num < 2 :
if s[l] != s[r]: # 未删除前不相等
if s[l+1] == s[r]: # 删除l后相等
l = l+1
del_num = del_num + 1
elif s[l] == s[r-1]: # 删除r后相等
r = r-1
del_num = del_num + 1
else:
return False
l,r = l+1, r-1
if del_num > 1: # 判断删除次数
return False
return True
分析与改错:
(1)报错测试用例: "aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga"
报错测试用例-核心部分: mlcupuu---uupuculm
(2)报错的逻辑与现象:l指向c&r指向u时不相等则进入删除判断if--elif--else;
判断if--elif--else执行过程,先判断l+1指向u&r指向u则执行删除l,则判断结束;=>造成删除成功但后续不能匹配且没有同时测试删除优边的情况是否后续能成功匹配;
若先判断l指向c&r-1指向c则后续可匹配成功;
(3)报错原因:if--elif--else判断执行过程具有先后;删除一个字符需要考虑两种情况即删除l字符与删除r字符;
(4)bug修复:增加checkreplies函数以判断后续字符串是否为回文串;用or表明两种情况只需满足一个即可判断;最多删除一个字符因此不需要del_num计数,只需要调用一次即可。
return checkreplies(l+1,r) or checkreplies(l,r-1)
class Solution(object):
def validPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
def checkreplies(l, r):
while l < r:
if s[l] != s[r]:
return False
l =l+1
r =r-1
return True
l, r = 0, len(s)-1
while l < r :
if s[l] != s[r]: # 未删除前不相等
return checkreplies(l+1,r) or checkreplies(l,r-1)
l,r = l+1, r-1
return True