【力扣】680.验证回文串II|每日一题|刷题打卡

112 阅读1分钟

一、题目描述

给你一个字符串 s最多 可以从中删除一个字符。

请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

示例 1:

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

示例 2:

输入: s = "abca"
输出: true
解释: 你可以删除字符 'c'

示例 3:

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

提示:

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

二、思路分析

一开始我想着是每截取一个字符串,然后在拼接起来,验证是否是回文串,但是这样太过繁琐,所以只需要判断:

  1. 如果s[i] !== s[j]时,只需要判断前一个的匹配或者是后一个的匹配即可
  2. 下标ij-1这一段是否是回文串 或者是 下标i+1j这一段是否是回文串

三、代码答案

/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function (s) {
  let i = 0, j = s.length - 1;
  while (i < j) {
    if (s[i] !== s[j]) {
      return isPali(s, i, j-1) || isPali(s, i+1, j)
    }
    i++
    j--
  }
  return true
};

function isPali(s, i, j) {
  while (i < j) {
    if (s[i] !== s[j]) return false
    i++
    j--
  }
  return true
}