这来自 LeetCode - Valid Palindrome。
给定一个字符串,确定它是否是回文,仅考虑字母数字字符并忽略大小写。
注意:为了解决这个问题,我们将空字符串定义为有效的回文。
while (regex.test(s[start])) { 开始++;} --> 无法理解它是如何工作的,我只理解 s[start] 是字母数字字符,它将是 false
if (!s[开始] || !s[结束]) --> 这是什么意思?
以下是完整代码
var isPalindrome = function(s) {
let regex = /[\W]/;
let start = 0;
let end = s.length - 1;
while (start < end) {
// Moves front runner to next alphanumeric
while (regex.test(s[start])) {
start++;
}
// Moves back runner to next alphanumeric
while (regex.test(s[end])) {
end--;
}
// Above would run until null if there are no alphanumeric characters so return true
if (!s[start] || !s[end]) {
return true;
}
// Check if equal and return false if not
if (s[start].toLowerCase() != s[end].toLowerCase()) {
return false;
}
// If index values match continue the while loop
start++;
end--;
}
return true;
};
请多多指教!
与之前的解决方案相同,加上: + 删除空格和符号,除了 (A-Z,a-z,0-9) + 小写
const isPalindrome = function(str) {
const expr = /[\W_]/g;
const lowcaseStr = str.toLowerCase().replace(expr, '');
const reverseStr = lowcaseStr.split('').reverse().join('');
return lowcaseStr === reverseStr
};
这是严重过度设计的。为什么不只使用一个带有 2 个计数器的 for 循环,一个从 0 开始,一个从最后一个索引开始,当它们不相等时,检查这些索引处的字符是否相同。或者使用内置函数,例如
function palindrome(str){ return str.split('').reverse().join('') == str}
我认为使用两指针技术来解决这个问题比创建反转的字符串版本更有效。为什么?此实现只需要一次传递字符串,使其高效,并且不需要额外的空间来存储反转的字符串。
function isPalindrome(s) {
// Convert to lowercase and remove non-alphanumeric characters
s = s.toLowerCase().replace(/[^a-z0-9]/g, '');
// Initialize pointers
let leftPointer = 0;
let rightPointer = s.length - 1;
// Move pointers inward and compare characters
while (leftPointer < rightPointer) {
if (s[leftPointer] !== s[rightPointer]) {
return false; // Characters don't match, not a palindrome
}
leftPointer++; // Move left pointer to the right
rightPointer--; // Move right pointer to the left
}
// If the loop completes without returning false, the string is a palindrome
return true; }