题目描述 - 验证回文串
给定一个字符串 s,判断是否为回文串 ,返回 true 或 false 。
回文串:正着读和反着读都一样的字符串。将所有大写字符转换为小写字符、并移除所有非字母数字字符,短语正着读和反着读都一样。字母和数字都属于字母数字字符。
示例:
- 输入:
s = "A man, a plan, a canal: Panama",输出:true, 解释: "amanaplanacanalpanama" 是回文串 - 输入:
s = "race a car",输出:false, 解释:"raceacar" 是回文串 - 输入:
s = " ",输出:true, 解释:空字符串正着反着读都一样,所以是回文串
思路分析
只需要比较前一半和后一半的反序相等即可,使用对撞指针的方法进行判断, 使用两个指针 left,right。left 指向字符串开始位置,right 指向字符串结束位置。
-
判断两个指针对应字符是否是字母或数字。 通过
left右移、right左移的方式过滤掉字母和数字以外的字符。 -
然后判断
s[left]是否和s[right]相等(注意大小写)。- 如果相等,则将
left右移、right左移,继续进行下一次过滤和判断。 - 如果不相等,则说明不是回文串,直接返回
False。
- 如果相等,则将
-
如果遇到
left == right,跳出循环,则说明该字符串是回文串,返回True。 代码实现:
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
// 首先去除非字符元素,转换大小写
s = s.replace(/[\W|_]/g, "").toLowerCase();
if(s.length < 2) return true
let left = 0, right = s.length-1;
while(left < right){
if(s[left] !== s[right]){
return false
}
left++;
right--
}
return true
};