剑指 Offer II 019. 最多删除一个字符得到回文串

一、题目

剑指 Offer II 019. 最多删除一个字符得到回文
同Leetcode 680. 验证回文字符串 Ⅱ

给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。

示例 1:
输入: s = "aba"
输出: true
二、解题思路

题解参考
方法:双指针+递归

从外边往中间进行比较
符串缩小比较,递归验证回文

(1)初始化两个指针 low 和 high 分别指向字符串的第一个字符和最后一个字符。
(2)每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 low = low + 1 和 high = high - 1,然后判断更新后的指针范围内的子串是否是回文字符串。
(3)如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 s[low + 1], s[low + 1], …, s[high],或者删除右指针对应的字符,留下子串 s[low], s[low + 1], …, s[high - 1]。
(4)当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。

三、代码
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 # 循环结束应该有一个返回值
四、复杂度分析

时间复杂度: O(n),其中 n 是字符串的长度。判断整个字符串是否是回文字符串的时间复杂度是 O(n),遇到不同字符时,判断两个子串是否是回文字符串的时间复杂度也都是 O(n)。
空间复杂度: O(1)。只需要维护有限的常量空间

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值