📅  最后修改于: 2023-12-03 15:28:44             🧑  作者: Mango
给定一个字符串,判断其是否为回文字符串。不考虑大小写和标点符号,并忽略空格。
例如,"A man, a plan, a canal: Panama" 是一个回文字符串。
你可以假设输入的字符串只包含 ASCII 码字符。
编写函数实现上述功能,并返回布尔值 true 或 false。
输入: "A man, a plan, a canal: Panama"
输出: true
输入: "race a car"
输出: false
本题是为了让代码熟练掌握字符串的相关处理而设计的。我们需要完成以下几个步骤:
为了完成第 1 步,我们可以使用正则表达式和字符串的 replace 方法:
str.replace(/[^\w]/g, '').toLowerCase();
正则表达式 [^\w]
表示去掉非字母或数字的字符,g 表示全局匹配,即去掉所有的非字母或数字的字符。调用 toLowerCase 方法将字符串转化为小写。
为了判断是否是回文字符串,我们可以使用双指针法。定义左右指针 l 和 r,初始化为字符串的两端,然后分别向中间移动,比较对应的字符是否相等。如果存在不相等的字符,则不是回文字符串。
/**
* @param {string} s
* @return {boolean}
*/
var isPalindrome = function(s) {
let str = s.replace(/[^\w]/g, '').toLowerCase();
let l = 0, r = str.length - 1;
while (l < r) {
if (str[l] !== str[r]) {
return false;
}
++l;
--r;
}
return true;
};
我们只遍历一遍字符串,所以时间复杂度为 O(n)。