这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
前言
js每日一道算法练习题,今天的算法题是一道字符串的处理问题,之前做过数字处理的相关题目,下面来看一下题目
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
解题思路
- 本题是验证字符串是不是回文,回文也就是中心对称的字符串,那么我们只要收尾进行对比就可以了
- 这里文中提到了可以忽略字母的大小写,那么我们不妨把字母都转换大写或者小写的,这样方便我们进行比较,以防出错
- 文中还提到只考虑字符串中的数字和字母,那我们可以想办法把字符串中除了是字母和数字的部分都给删除掉,但我想到这一步的时候我的第一反应就是根据ASCII码来删除不是数字和字母的部分,但一开始写就发现这样会很复杂,需要做的判断非常多,无从下手
- 由于上面根据ASCII进行判断不太合适,我又用了正则表达式来删除字符串中的非字母和数字部分
- 当经过删除非子母和数字部分,然后都转换为小写字母,这时候我们只有从首尾开始一步一步的判断是否相等就可以了,这里声明两个指针,初始位置分别指向字符串的头部和尾部,当left和right指针所指相等时就left++,right--,知道left<right不成立,所得结果就是我们要的结果,下面看代码
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
var reg = /[^A-Z0-9a-z]/g
s = s.replace(reg,'').toLowerCase() //通过正则删除非字母和数字部分并将字母都转换成小写
let left = 0
let right = s.length-1
while(left<right){
if(s[left]===s[right]){
left++
right--
}else{
return false
}
}
return true
};
总结
本题是一道简单字符串相关题目,本文的核心就是找到实际要比较的内容,然后通过双指针移动来判断是不是回文字符串,这里如果不想用双指针也可以直接反转字符串和原来的字符串对比看是否是一样(注意:这里的字符串是已经经过删除非字母和数字元素之后并进行了转换小写的字符串)