问题描述:
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xne8id/
来源:力扣(LeetCode)
解法一:js-api
思路:使用api得到只含数字字母的字符串,将其翻转,二者比较。但需要注意的是,数组的深浅拷贝问题。
var isPalindrome = function(s) {
//获取统一小写后的字符串数组
let arr = Array.from(s.toLowerCase())
let asciiVal
//筛选出只含字母数字的数组
let newArr = arr.filter((item) => {
asciiVal = item.charCodeAt()
return asciiVal >= 48 && asciiVal <= 57 || asciiVal >= 97 && asciiVal <= 122
})
arr = newArr.slice() //★数组浅拷贝★
//数组翻转
newArr.reverse()
//数组转化为字符串并比较
return arr.join('') === newArr.join('')
}
解法二:双指针
思路:一个指针从前往后,另一个从后往前,遇到非数字字母就跳过,判断两个指针所指向的元素值是否相等
var isPalindrome = function(s) {
let arr = s.toLowerCase()
let p = 0, q = s.length - 1
let test = /[a-z0-9]/ //字母数字字符正则式
while(p < q){
//先去除非数字字母字符
while(p < q && !test.test(arr[p])) p++
while(p < q && !test.test(arr[q])) q--
//判断是否对称
if(arr[p] != arr[q]) return false
p++
q--
}
return true
}