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"));
我正在编写一个简单的算法来检查 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"));