📜  门| GATE-CS-2014-(Set-3) |第 60 题(1)

📅  最后修改于: 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. 将字符串转化为小写,去掉标点符号和空格。
  2. 判断该字符串是否是回文字符串。

为了完成第 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)。