题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
力扣原题目地址:https://leetcode.cn/problems/...解决方案 方案一 判断第
i
项和第j
项是否相等(i+j==s.length-1)
下方代码中,我就不区分
i
和j
了,直接是i
和(filterS.length - 1) - i
var isPalindrome = function (s) {
let flag = true
// 先加工数据,替换去掉空格特殊符号,以及转成小写英文统一对比
let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()
for (let i = 0;
i < filterS.length;
i++) {
// 如果有其中一项不符合规则,就直接结束循环,返回结果即可
if (filterS[i] != filterS[filterS.length - 1 - i]) {
flag = false
return flag
}
}
// 最后再返回一下,因为有可能就是回文数,要返回true
return flag
};
注意,代码中的循环,其实不用循环所有项,只需要循环一半就行了,所以上述代码也可以换一下写法:
for (let i = 0;
i < Math.trunc(filterS.length / 2);
i++) {......}
注意冷门api之Math.trunc()是取整的意思
Math.trunc(2.5) // 2
Math.trunc(3) // 3
使用方案二 字符串转数组反转对比Math.trunc()
只循环一半虽然消耗内存少了一些,但是所花费的时间会多一些了,因为Math公式
也会花费时间的
var isPalindrome = function (s) {
// 先加工数据,去掉空格特殊符号,以及转成小写英文统一对比
let filterS = s.replace(/[^A-Za-z0-9]/g, '').toLocaleLowerCase()
let filterSArr = filterS.split('') // 转成正常顺序数组
let filterSArrReverse = filterS.split('').reverse() // 转成倒叙顺序数组
if (JSON.stringify(filterSArr) == JSON.stringify(filterSArrReverse)) { // 比较是否相等
return true
} else {
return false
}
};
这方法虽然也能实现,但是性能却是没有方案一好,因为
数组的方法反转
、以及JSON序列化
本身也是要耗费时间的总结 【力扣之有效的回文】正常情况下,我们使用空间换时间,多耗费一点点内存,但是时间提速一些,还是划算的。所以方案一是首选
另附正则,只能输入中英文数字 str = str.replace(/[^\u4E00-\u9FA5A-Za-z0-9]/g, '')