允许删一个的回文字符串算法

题目

给定一个非空字符串 str,最多删除一个字符。判断是否能成为 回文字符串

注意:
字符串只包含从 a-z 的小写字母。字符串的最大长度是 50000

假设:

  • 输入 aba ,返回 true
  • 输入 abca ,返回 true
  • 输入 abeca ,返回 false

算法解析

  • 利用回文字符串的对称性,可以使用双指针来优化算法。

代码

const validPalindrome  = (str) => {
  const arr = str.split('')
  // 初始化左右指针
  let i = 0
  let j = arr.length - 1
  // 允许被删除
  let deleteNum = 1
  
  while(i <= j) {
    // 如果左右指针指向的字符相等
    if (arr[i] === arr[j]) {
      // 再往中间移动
      i++
      j--
    } else {
      // 如果之前已经删过一次了,直接返回 false
      if (deleteNum < 1) {
        return false
      }
      // 如果删左边指针的字符,能与当前右边的字符相等
      if (arr[i + 1] === arr[j]) {
        deleteNum--
        i = i + 2
        j--
      } else if (arr[i] === arr[j - 1]) {
        // 如果删右边指针的字符,能与当前左边的字符相等
        deleteNum--
        j = j - 2
        i++
      } else {
        return false
      }
    }
  }

  return true
}

你可能感兴趣的:(允许删一个的回文字符串算法)