给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: "aba"
输出: True
示例 2:
输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。
思路:这个题和125.验证回文串还不一样,它分两种情况来讨论。如果它是传统的回文串那就返回True,如果一个字符串删掉一个字符是回文串那么它也算是回文串。传统的当然好处理了,在125题中已经写过了。对于非传统的回文串,我们要删掉一个字符然后在判断是不是回文串。采用双指针法,两种思路:(1)如果左右两个指针指向的字符不相等的时候,那么在原始字符串中分别删除这两个不相等的字符,判断删除后的字符串是不是回文串。分别删除后的结果可以取或,一旦有一种情况满足就可以了。(2)如果一个字符串是回文串,那么它的子串也都是回文串,那么遇见不相等的元素,要么删除左边的,要么删除右边的。只要有删除后任何一种情况的字符串是回文串那么就说明删除一个字符可以构成回文串,否则删除一个字符不能是回文串。
class Solution:
def validPalindrome(self, s: str) -> bool:
#判断回文串用双指针
'''
def checkPalindrome(low,high):
while low<high:
if s[low]!=s[high]:
return False
low+=1
high-=1
return True
low,high = 0,len(s)-1
while low<high:
if s[low]==s[high]:
low+=1
high-=1
else:
return checkPalindrome(low+1,high) or checkPalindrome(low,high-1)
return True
'''
#判断回文串用反转函数
low,high = 0,len(s)-1
while low<high:
#遇到不相等的时候,出现两种case:1.删除左边;2.删除右边
if s[low]!=s[high]:
case1,case2 = s[low:high],s[low+1:high+1]
return case1==case1[::-1] or case2==case2[::-1]
low+=1
high-=1
return True
画图解释:
总结:回文串的子串也是回文串;字符串多用双指针。