
回文串是指一个正读和反读都一样的字符串,例如“level”、“racecar”或“上海自来水来自海上”。在计算机科学中,判断一个字符串是否为回文串是一个常见的问题。双指针模式(two pointers pattern)是解决此类问题的一种高效且直观的方法。
双指针模式通过在数据结构的两端或特定位置设置两个指针,然后根据特定条件向中间或特定方向移动,以完成遍历、比较或操作。对于回文串判断,其基本思想是:
在进行回文串判断之前,通常需要对原始字符串进行预处理,以确保比较的准确性。这主要包括两个方面:
预处理可以通过正则表达式和字符串方法实现。
以下是使用 JavaScript 实现双指针模式判断回文串的示例代码:
/**
* 判断一个字符串是否为回文串
* @param {string} s 输入字符串
* @return {boolean} 是否为回文串
*/
var isPalindrome = function(s) {
// 1. 预处理字符串:转换为小写并移除所有非字母数字字符
const cleanedStr = s.toLowerCase().replace(/[^0-9a-z]/g, "");
// 2. 初始化双指针
let left = 0; // 左指针,指向字符串开头
let right = cleanedStr.length - 1; // 右指针,指向字符串末尾
// 3. 遍历比较:当左指针小于右指针时继续循环
while (left < right) {
// 如果左右指针指向的字符不相等,则不是回文串
if (cleanedStr[left] !== cleanedStr[right]) {
return false;
}
// 移动指针:左指针向右移动,右指针向左移动
left++;
right--;
}
// 如果循环结束仍未返回 false,说明是回文串
return true;
};
// 示例测试
console.log(isPalindrome('racecar')); // true
console.log(isPalindrome('A man, a plan, a canal: Panama')); // true
console.log(isPalindrome('Ceci n’est pas une palindrome')); // false
console.log(isPalindrome('')); // true (空字符串是回文串)
console.log(isPalindrome('a')); // true (单个字符是回文串)原始问题中提到了对 while(left < right) 循环条件的疑问,特别是对于奇数长度字符串(如 'racecar')是否会“遗漏”中间字符。这里我们详细解释其工作原理:
总结: while(left < right) 条件确保了我们只比较需要配对的字符。当 left 指针和 right 指针相遇或交叉时,所有必要的对称比较都已经完成。对于奇数长度的字符串,中间的字符是它自己,无需进行额外的比较。
如果将循环条件改为 while(left <= right),对于奇数长度字符串,循环会多执行一次,将中间字符与自身进行比较。例如对于 'racecar',当 left 和 right 都指向 'e' 时,left <= right 仍然为真,会执行一次 cleanedStr[3] === cleanedStr[3] 的比较。这虽然不会影响结果的正确性,但多了一次不必要的比较操作。因此,在大多数情况下,while(left < right) 是更简洁和高效的选择。
双指针模式是解决回文串判断问题的有效方法。通过在字符串两端设置指针并向内移动,我们可以高效地比较对称位置的字符。理解 while(left < right) 循环条件对于正确处理奇数和偶数长度字符串至关重要,它避免了不必要的比较,使得算法既正确又高效。掌握这一模式不仅能解决回文串问题,也能为解决其他需要双向遍历或配对比较的算法问题提供思路。
以上就是使用双指针模式判断回文串的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号