Javascript 回文算法中的匹配函数问题

Javascript Match Function Issue In Palindrome Algorithm

我正在编写一个简单的算法来检查 javascript 中的字符串是否为回文。这是我目前所拥有的:

var isPalindrome = function(s) {
    let i=0;
    let j=s.length-1;
    while (i < s.length && j >= 0) {
        while (s[i].toLowerCase().match('[a-z0-9].') === false && i < s.length) {
            i++;
        }
        while (s[j].toLowerCase().match('[a-z0-9].') === false && j >= 0) {
            j--;
        }
        if ((s[i].toLowerCase()) !== (s[j].toLowerCase())) {
            console.log(s[i].toLowerCase());
            console.log(s[j].toLowerCase());
            return false
        } else {
            i++;
            j--;
        }
    }
    return true;
};

预期的输入可以包含非字母数字字符,例如.'";/ 或空格,但它们将被忽略。例如,

“一个人,一个计划,一条运河:巴拿马”

应该 return 为真,因为一旦字符串被去除任何空格和标点符号等,它就是一个有效的回文。我的问题是,当我 运行 此示例输入此代码时,上面 if 循环中的 console.log 语句打印:

[whitepsace (a blank line)]
m

表示在第一个while循环中,语句 当 s[i] 是空格时,s[i].toLowerCase().match('[a-z0-9].') return 为真,导致函数错误地 return 为假,这对我来说没有意义,因为我的正则表达式在其字符 class 中不包含空格。为什么此语句 return 对于空白字符是正确的?

即使您更正了正则表达式(通过删除点),内部 while 循环也可能会退出,因为您到达了数组的末尾,在比较中留下超出范围的索引引用接下来是 if.

最好只删除不是字母数字的字符,甚至在开始循环之前将所有字符都变成小写。此外,您可以在 i 越过 j:

时停止外循环

var isPalindrome = function(s) {
    s = s.toLowerCase().replace(/[^a-z\d]/g, "");
    for (let i = 0, j = s.length - 1; i < j; i++, j--) {
        if (s[i] !== s[j]) {
            console.log(s[i], s[j]);
            return false;
        }
    }
    return true;
};

console.log(isPalindrome("A man, a plan, a canal: Panama"));