当前位置: 首页 > news >正文

力扣125.验证回文串-双指针

问题描述

在编程面试中,验证回文串是一个经典问题。题目要求我们判断一个字符串是否为回文串,但有两个特殊要求:

  1. 只考虑字母和数字字符

  2. 忽略字符的大小写

示例 1:

text

输入: "A man, a plan, a canal: Panama" 输出: true 解释: "amanaplanacanalpanama" 是回文串

示例 2:

text

输入: "race a car" 输出: false 解释: "raceacar" 不是回文串

什么是回文串?

回文串是指正着读和反着读都一样的字符串。例如:

  • "level"

  • "radar"

  • "上海自来水来自海上"

解决:双指针法

核心思想

使用两个指针从字符串的两端向中间移动,逐步比较字符是否相同。

算法步骤

  1. 初始化指针

    • 左指针i指向字符串开头

    • 右指针j指向字符串结尾

  2. 主循环

    • 当左指针小于右指针时继续比较

  3. 跳过非字母数字字符

    • 如果左指针指向的字符不是字母或数字,左指针右移

    • 如果右指针指向的字符不是字母或数字,右指针左移

  4. 比较字符

    • 将字符转换为小写后比较

    • 如果相同,两个指针都向中间移动

    • 如果不同,直接返回false

  5. 结束条件

    • 当所有有效字符都比较完毕且都相同时,返回true

代码实现

class Solution { public boolean isPalindrome(String s) { int i = 0; // 左指针 int j = s.length() - 1; // 右指针 while (i < j) { // 主循环 // 跳过左侧非字母数字字符 if (!Character.isLetterOrDigit(s.charAt(i))) { i++; } // 跳过右侧非字母数字字符 else if (!Character.isLetterOrDigit(s.charAt(j))) { j--; } // 比较字符(忽略大小写) else if (Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(s.charAt(j))) { i++; // 左指针右移 j--; // 右指针左移 } // 字符不同,不是回文串 else { return false; } } return true; // 所有字符匹配 } }

算法详解

关键方法解析

1.Character.isLetterOrDigit(char ch)

这个方法用于判断字符是否为字母或数字:

  • 字母:A-Z, a-z

  • 数字:0-9

  • 其他字符(标点、空格等)返回false

2.Character.toLowerCase(char ch)

将字符转换为小写:

  • 大写字母:A → a

  • 小写字母和数字:保持不变

  • 确保大小写不敏感的比较

复杂度分析

时间复杂度:O(n)

  • n是字符串的长度

  • 每个字符最多被访问一次(左指针或右指针)

  • 最坏情况下需要遍历整个字符串

空间复杂度:O(1)

  • 只使用了常数级别的额外空间

  • 只存储了两个指针和几个临时变量

优化技巧

1. 预处理字符串(备选方案)

可以先清洗字符串,再判断:

public boolean isPalindromeAlternative(String s) { // 1. 转换为小写 // 2. 移除非字母数字字符 String cleaned = s.toLowerCase().replaceAll("[^a-z0-9]", ""); // 3. 判断清洗后的字符串是否为回文 int left = 0, right = cleaned.length() - 1; while (left < right) { if (cleaned.charAt(left) != cleaned.charAt(right)) { return false; } left++; right--; } return true; }

优缺点:

  • 优点:代码更简洁

  • 缺点:需要额外的O(n)空间存储清洗后的字符串

2. 使用StringBuilder反转

public boolean isPalindromeWithBuilder(String s) { String cleaned = s.toLowerCase().replaceAll("[^a-z0-9]", ""); String reversed = new StringBuilder(cleaned).reverse().toString(); return cleaned.equals(reversed); }

优缺点:

  • 优点:代码极简

  • 缺点:需要额外空间,且比较整个字符串

常见错误

错误1:忘记处理大小写

java

// 错误代码 if (s.charAt(i) == s.charAt(j)) { ... } // 应使用toLowerCase转换

错误2:指针移动逻辑错误

java

// 错误代码:同时移动指针 if (!Character.isLetterOrDigit(s.charAt(i))) { i++; j--; // 错误:不应该同时移动j }

错误3:边界条件处理不当

java

// 错误:没有考虑空字符串或全无效字符的情况 if (s.length() == 0) return false; // 应返回true

扩展思考

1. 如何修改代码以支持Unicode字符?

使用Character.isLetter()Character.isDigit()分开判断:

java

if (!Character.isLetter(c) && !Character.isDigit(c)) { // 跳过 }

2. 如何找到最长回文子串?

这是LeetCode第5题,可以使用动态规划中心扩展法解决。

3. 如何统计字符串中的回文子串数量?

可以使用中心扩展法,统计以每个字符为中心的回文数量。

总结

验证回文串问题虽然简单,但涵盖了多个重要编程概念:

  • 双指针技巧:高效的遍历方法

  • 字符处理:大小写转换、字符类型判断

  • 边界条件:空字符串、特殊字符处理

  • 时间复杂度优化:O(n)时间复杂度和O(1)空间复杂度

掌握这个问题的解法不仅有助于通过面试,还能加深对字符串处理和算法优化的理解。

关键要点记忆:

  1. 使用双指针从两端向中间遍历

  2. 使用Character.isLetterOrDigit()过滤无效字符

  3. 使用Character.toLowerCase()统一大小写

  4. 注意边界条件的处理

http://www.jsqmd.com/news/324162/

相关文章:

  • 激光封边改造哪家好?2026佛山设备维修搬迁厂家+封边机激光升级厂家推荐优选
  • NCPC 2018 Explosion Exploit
  • 封边机升级改造哪家好?封边机规方连线哪家好?2026封边机多带道改造厂家+封边机连线解决方案厂商全攻略
  • 2026佛山非标自动化配套工厂甄选:六面钻连线定制厂家盘点附带濠派设备升级改造靠谱吗解析
  • 隔断镂空砖厂家/幕墙干挂陶板砖定制厂家需要具备哪些优势?2026厂家盘点分析
  • 【课程设计/毕业设计】基于SpringBoot+Vue的汽车租赁管理系统管理系统设计与实现基于MyBatis的在线车辆租赁信息管理系统的设计与实现【附源码、数据库、万字文档】
  • 2026年靠谱的装配式内装冰火板高分厂家推荐
  • 还在找专业屋面陶土瓦厂家/别墅陶瓷瓦厂家?2026厂家综合盘点
  • Java毕设选题推荐:基于springboot的游戏分享网站的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java计算机毕设之基于springboot的游戏分享网站的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 智慧农业之辣椒检测目标检测数据集 农产品分拣场景识别 青甜椒与红甜椒自动识别 智能农业设备开发识别 深度学习YOLO格式10460期
  • 干挂陶土砖定制厂家/多孔陶土砖厂家怎么选?2026厂家使用好评汇总分析
  • 2026年靠谱的硅酸钙冰火板好评厂家曝光
  • 全自动凉皮机哪家好?专业的凉皮机哪家好?2026精选厂家汇总
  • Java毕设选题推荐:基于SpringBoot的电脑笔记本维修工单进度管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 键盘映射工具改键位,绿色版设置后重启生效
  • 圆盘凉皮机哪家好?2026厂家汇总从质量到标杆的品质之选盘点
  • Java计算机毕设之基于SpringBoot的电脑维修工单售后管理系统的设计与实现基于SpringBoot的电脑维修工单管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • C# 关于联合编程基础
  • Java计算机毕设之基于MyBatis的在线车辆租赁信息管理系统的设计与实现基于 Spring Boot+MySQL 的汽车租赁管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • ONLYOFFICE AI 插件新功能:轻松创建专属 AI 助手
  • 酿皮机哪家好?米皮机哪家好?2026厂家盘点,以技术实力定义行业标杆
  • 取名软件:输入信息匹配名字智能打分无广告
  • 2026年比较好的乳胶用橡胶助剂/功能橡胶助剂热门厂家榜
  • “数字员工”的基本能力和特殊有哪些?
  • [嵌入式系统-166]:电机类型的演进过程
  • 构建学生健康午休生态,为教育装备现代化提质增效
  • 企业级政府管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 【Vue 功能总结】Element UI 级联组件实现
  • 前后端分离搭建疫情管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程