图解题库 / 双指针

125. 验证回文串

简单 含交互动画

学完这道你应该能: 说清它为什么用「双指针」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

只考虑字母和数字、忽略大小写,判断字符串是否为回文

s = "A,b,a"
清洗后 = "aba"
输出 = true

思路解析

l 从左、r 从右。任一指针指向标点或空格就跳过;两边都落在字母数字上时,转小写比较:不等直接 false,相等就双双向内收。相遇即 true。

l=0, r=4:两端 'A' 和 'a',忽略大小写相等。一对通过,l 右移、r 左移。

l=1 是 ',' · 跳过:l 指向逗号,不是字母数字,跳过,l 前进到 2。

r=3 是 ',' · 跳过:r 指向逗号,同样跳过,r 退到 2。现在 l == r == 2。

l == r · 完成:l 和 r 在中间字符 b 相遇,全程比较都通过,返回 true

回文类问题的通用套路:左右指针向中间走、逐对比较;遇到要忽略的字符就只移动那侧的指针。

参考代码(Python)

Python
1l, r = 0, len(s) - 1
2while l < r:
3    while l < r and not s[l].isalnum(): l += 1   # 跳左杂质
4    while l < r and not s[r].isalnum(): r -= 1   # 跳右杂质
5    if s[l].lower() != s[r].lower(): return False
6    l += 1; r -= 1
7return True

复杂度分析

  • 时间复杂度:O(n) —— 每个字符最多看一次
  • 空间复杂度:O(1) —— 原地双指针

套路模板

记住骨架:两端向内、跳过无关项、规范化后比较、不等即假。改一下「跳过」和「规范化」规则就能套各种回文判定。

Python
1l, r = 0, n - 1
2while l < r:
3    while l < r and 该跳过(s[l]): l += 1
4    while l < r and 该跳过(s[r]): r -= 1
5    if 规范化(s[l]) != 规范化(s[r]): return False
6    l += 1; r -= 1
7return True

易错点

  • 内层跳过时不判 l < r → ✅ while 里始终带 l < r(全是杂质时指针会越界)
  • 比较忘了统一大小写 → ✅ 都 .lower() 再比(题目忽略大小写)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →1137. 泰波那契数 ← 返回题库