题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
输入: s = "race a car" 输出: false 解释: "raceacar" 不是回文串。
题解
第一种
我们这里接收一个参数 str。首先通过 if 判断字符串长度是否小于 2,若是则一定是回文字符串,直接返回 true。接着定义了一个匹配非数字和小写字母的正则表达式 reg,接下来将传入的字符串转为小写字母,再通过 replace 方法将非数字和小写字母的字符替换为空字符串,从而得到真正需要判断的字符串 realStr。接下来通过计算 realStr 的中间位置(若长度为奇数则为中间字符,若长度为偶数则为中间两个字符的左边一个)得到 midleIndex,并定义一个布尔值变量 result 初始化为 true。最后通过双指针比较 realStr 的首尾字符,若不相等则将 result 置为 false,并跳出循环。最终函数返回 result。
var isPalindrome = function(str) { if(str.length < 2) { return true; } const reg = /[^0-9a-z]/g; const smallStr = str.toLowerCase(); const realStr = smallStr.replace(reg, ''); const midleIndex = parseInt(realStr.length / 2); let result = true; for(let i = 0; i < midleIndex; i++) { if(realStr.charAt(i) !== realStr.charAt(realStr.length - 1 - i)) { result = false; break; } } return result; };
第二种
我们先创建一个数组 res,用于存放提取出来的字母和数字,使用 for 循环遍历字符串 s 中的每一个字符,若该字符是数字、大写字母或小写字母,则将该字符添加到数组 res 中,使用数组的 reverse 方法将数组 res 反转,并使用数组的 join 方法将其转化为字符串格式,赋值给变量 str,将变量 str 中的所有字符转换成大写字母形式。,在将字符串 str 再次使用字符反转的方法进行反转,并赋值给变量 strF。最后判断变量 str 是否等于变量 strF,若相等则说明原字符串是一个回文字符串,返回 true,否则说明不是回文字符串,返回 false
var isPalindrome = function (s) { let res = []; for (let i = 0; i < s.length; i++) { if ( (48 <= s.charCodeAt(i) && s.charCodeAt(i) <= 57) || (65 <= s.charCodeAt(i) && s.charCodeAt(i) <= 90) || (97 <= s.charCodeAt(i) && s.charCodeAt(i) <= 122) ) { res.push(s[i]); } } let str = res.reverse().join(""); str = str.toUpperCase(); let strF = str.split("").reverse().join(""); return str == strF; };