验证回文字符串 Ⅱ

141 阅读2分钟

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

一、题目描述

  • 给定一个非空字符串 s最多删除一个字符。判断是否能成为回文字符串。
  • 示例 1:
    • 输入: s = "aba"
    • 输出: true
  • 示例 2:
    • 输入: s = "abca"
    • 输出: true
  • 示例 3:
    • 输入: s = "abc"
    • 输出: false
  • 提示
    • 1 <= s.length <= 100000
    • s 由小写英文字母组成

二、思路分析:

  • 判断一个字符串是否是回文字符串,简单的方式就是先将字符串转化为数组,再利用数组的reverse方法反转后再拼接成字符串与之比较,如果相等,这个字符串就是回文字符串
  • 当给定的字符串不删除字符的情况下不是回文字符串时,这个时候需要删除一个字符串,再执行上面的操作
  • 这里先从字符串的第一个开始删除,然后返回拼接,如果删除后的字符串和删除后反转的字符串相等,就是说明这个字符串能够通过删除其中一个字符来返回一个回文串的能力,返回true,如果删除任意一个都不能满足删除后的字符串与删除后的字符串反转相等的话,就说明这个字符串不能通过删除其中一个字符来实现回文串,返回false

三、AC 代码:

function validPalindrome(s: string): boolean {
    let strArr = s.split('');
    // 复制一份未反转的样本
    let copyArr = JSON.parse(JSON.stringify(strArr));
    let reveStr= strArr.reverse().join();
    if(reveStr === s){
        return true
    }
    for(let i = 0; i < copyArr.length; i++){
        // 每次遍历复制一份样本,从这个样本上剪切一个字符串
        let copy = JSON.parse(JSON.stringify(copyArr));
        copy.splice(i, 1);
        // 复制衣服删除字符后的样本,用来后面比较
        let copyTwo = JSON.parse(JSON.stringify(copy));
        copy.reverse();
        if(copy.join() === copyTwo.join()){
            return true
        }
    }
    return false;
} 

四、总结:

  • splice方法用作删除会改变原数组的长度,所以每次删除前需要先复制一份出来。
  • 更多解题方式,移步题解区