Skip to content

125. 验证回文串

js
;(function () {
  /**
   * 125. 验证回文串
   * 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
   * 说明:本题中,我们将空字符串定义为有效的回文串。
   *
   * 输入: "A man, a plan, a canal: Panama"
   * 输出: true
   * 解释:"amanaplanacanalpanama" 是回文串
   *
   * 输入: "race a car"
   * 输出: false
   * 解释:"raceacar" 不是回文串
   *
   */

  function isPalindrome(s: string): boolean {
    // 方法一:
    // // 1. 去掉 特殊字符(不是数字和字母的),字母全部小写
    // let newS: string = s.replace(/[^A-Za-z0-9]/ig, '').toLowerCase();
    // // 2. 回文串应该是左右对称的
    // let newSLen: number = newS.length;
    // let mid: number = Math.ceil(newSLen / 2);
    // for (let i = 0; i < mid; i++) {
    //     // console.log(newS.charAt(i), newS.charAt(newSLen - 1 - i))
    //     if (newS.charAt(i) !== newS.charAt(newSLen - 1 - i)) {
    //         return false
    //     }
    // }
    // return true;

    // 方法二:双指针
    // todo

    // 方法三:判断 字符串反转 === 原字符串
    // 1. 去掉 特殊字符(不是数字和字母的),字母全部小写
    let newS: string = s.replace(/[^A-Za-z0-9]/gi, '').toLowerCase()
    // 2. 回文串应该是左右对称的
    let newSLen: number = newS.length
    let mid: number = Math.floor(newSLen / 2)
    let isOdd: boolean = newSLen % 2 === 0
    let left: string = newS.substring(0, mid)
    let right: string = newS.substring(isOdd ? mid : mid + 1)
    let rightReverse: string = right.split('').reverse().join('')
    return rightReverse === left
  }

  let s1 = 'A man, a plan, a canal: Panama'
  // let s1 =  "Abba";
  let s2 = 'race a car'
  console.log(isPalindrome(s1))
  console.log(isPalindrome(s2))
})()