每日算法题-leetcode第680题-验证回文字符串

193 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode今日题目第680题-验证回文字符串

一、题目描述

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

示例1

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

示例2

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

二、思路分析

什么是回文字符串?

关于中心左右对称的字符串。例如:ABCBA或者AACCAA是回文字符串;ABCCA或者AABBCC不是回文字符串。

判断方法就是,依次看两端的字符是否相等。例如:ABCBA,第一个字符与最后一个字符相等,第二个字符与倒数第二个字符相等,第三个字符是中心字符,无需判断。如果是AACCAA就要判断。所以上面的字符串是回文字符串。大家可以试试这个题:125. 验证回文串,这个题目搞懂了,本题就迎刃而解了。

解题思路

  • 从字符串的两端开始向里逐步比较两个字符串是不是相同
  • 如果相同则继续向里移动指针比较里面的两个字符
  • 如果不相同,在删除一个字符之后再比较其它的字符就能够形成一个回文
  • 由于事先不知道应该删除两个不同字符中的哪一个,因此两个字符都进行尝试

三、JavaScript 代码

var validPalindrome = function (s) {
  const len = s.length;
  let i = 0,
    j = len - 1;

  while (i < j && s[i] === s[j]) {
    i++;
    j--;
  }

  if (isPalindrome(i + 1, j)) {
    return true;
  }

  if (isPalindrome(i, j - 1)) {
    return true;
  }

  function isPalindrome(st, ed) {
    while (st < ed) {
      if (s[st] !== s[ed]) {
        return false;
      }
      st++;
      ed--;
    }
    return true;
  }

  // 默认返回false
  return false;
};

四、总结

本题应用的也是指针法来解题。首先判断了这个字符串是不是一个回文字符串,如果不是,删除一个字符,继续判断剩下的字符串是不是一个回文字符串,左右各删除一次,以此类推。

五、最后

我是朽木白,一个热爱分享的程序猿。如果觉得本文还不错,记得点赞+关注❤️