JavaScript 回文判断的实现与优化实践
【摘要】 梳理 JavaScript 回文判断的三种常见实现:反转比较法、双指针法与中文回文处理细节,并给出性能对比与适用场景建议。
回文判断是算法学习中的经典入门题,也是前端面试的高频考点。本文以 JavaScript 为例,梳理几种常见实现思路,并给出各自的适用场景与性能差异。
一、什么才算回文?
回文指正读和反读完全相同的字符串,例如 racecar。工程实践中通常还要处理两个细节:
- 忽略大小写:
Level应视为回文; - 忽略标点与空格:
A man, a plan, a canal: Panama应视为回文。
二、三种常见实现
1. 反转比较法
先把字符串清洗成只含字母数字的小写形式,再与反转结果比较:
function isPalindrome(str) {
const cleaned = str.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]/g, '');
return cleaned === cleaned.split('').reverse().join('');
}
优点是简洁易读,时间复杂度 O(n),但会额外生成两三个临时字符串,空间开销略高。
2. 双指针法
首尾各设一个指针,跳过非字母数字字符后逐位比较,不匹配立即返回 false:
function isPalindrome2(str) {
const s = str.toLowerCase();
let i = 0, j = s.length - 1;
while (i < j) {
while (i < j && !/[a-z0-9\u4e00-\u9fa5]/.test(s[i])) i++;
while (i < j && !/[a-z0-9\u4e00-\u9fa5]/.test(s[j])) j--;
if (s[i++] !== s[j--]) return false;
}
return true;
}
空间复杂度 O(1),遇到不匹配字符可以提前退出,适合超长文本的校验场景。
3. 中文回文的注意事项
中文没有大小写之分,但要注意全角标点(如,。!?)同样需要清洗。上海自来水来自海上 这类句子用上面的正则即可正确处理。
三、性能对比
在 Node.js 环境下对 10 万长度的字符串做基准测试,双指针法比反转比较法快约 30%~40%,主要收益来自提前退出与零临时数组。日常业务中两者差异可以忽略,优先选择可读性。
四、小结
回文判断的价值不在题目本身,而在于它串起了字符串清洗、正则、双指针等基础技能。建议记住双指针模板,在面试或代码评审中都能派上用场。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)