我正在编写一个简单的算法来检查字符串是否是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;
};
预期的输入可以包括非字母数字字符,例如. .'";/, 或空格,但它们将被忽略。例如,
"一个人一个计划一条运河巴拿马"
应该返回true,因为一旦字符串被去掉任何空格和标点符号等,它就是一个有效的回文。我的问题是,当我在此示例输入上运行此代码时,上面if循环中的控制台. log语句会打印:
[whitepsace (a blank line)]
m
指示在第一个while循环中,语句s[i]. toLowerCase().match('[a-z0-9].')在s[i]为空格时返回true,导致函数错误地返回false,这对我来说没有意义,因为我的正则表达式在其字符类中不包含空格。为什么此语句对空格字符返回true?
即使您更正了正则表达式(通过删除点),内部的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"));