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

67 阅读1分钟

前言

记录一下算法的学习

题目描述

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

示例1

输入: s = "aba"
输出: true

示例2

输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符

示例3

输入: s = "abc"
输出: false

提示

1 <= s.length <= 105
s 由小写英文字母组成

解题思路

  1. 在做题之前需要了解什么是回文字符串
  • 顺着读和倒着读一样
  • 将一个字符串从中间来一刀,左右是对称的
  • 如poaaop就是一个回文字字符串
  1. 了解了什么是回文字符串,可以根据对称性来解题
  2. 定义两个指针,分别从首尾开始,向内移动,形成对撞指针
  3. 如果两个值相同,就向内移动,直到不相同为止
  4. 题目中可以最多删除一个字符,有两个方案,左指针向内移动或者右指针向内移动
  5. 移动完成后继续对撞比较,只要出现一个不相同,这个字符串就不是回文

代码

/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function (s) {
    // 回文字符串,从中间开始,对称
    let i = 0
    let j = s.length - 1
    while (i < j && s[i] === s[j]) {
        i++
        j--
    }
    const checkPalindrome = (left, right) => {
        while (left < right) {
            if (s[left] != s[right]) {
                return false
            }
            left++
            right--
        }
        return true
    }
    if (checkPalindrome(i + 1, j)) return true
    if (checkPalindrome(i, j - 1)) return true

    return false
};

复杂度分析

  • 时间复杂度:需要遍历整个字符串,所以时间复杂度为O(N)
  • 空间复杂度:需要两个变量保存指针,所以为O(1)

最后

每天进步一点点