《Leetcode》680、 验证回文字符串 Ⅱ

给定一个非空字符串 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

画图解释:

总结:回文串的子串也是回文串;字符串多用双指针。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值