题目描述
只考虑字母和数字、忽略大小写,判断字符串是否为回文。
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() 再比(题目忽略大小写)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。