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))
})()