我正在写一个简单的算法来检查一个字符串是否是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循环中的console.log语句会打印出来:
[whitepsace (a blank line)]
m在第一个while循环中指示语句si.toLowerCase().match(‘a-z0-9’)当si为空格时返回true,导致函数错误地返回false,这对我来说没有任何意义,因为我的正则表达式在其字符类中不包含空格。为什么这条语句对空格字符返回true?
发布于 2021-04-26 03:01:16
即使您更正了正则表达式(通过删除点),内部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"));
https://stackoverflow.com/questions/67257099
复制相似问题