题目描述
思路解析动画文字版
最直接的想法:先 for 一遍过滤掉标点、转小写造出 "abcba",再反转比较。能做,但白白多扫一遍、多开一个字符串。
转折:不必造新串。l 从左、r 从右同时向里走,谁指向标点就只移谁、不比较(这就是负例动作);两边都落在字母数字上时才转小写比一对。相遇即说明全程对称。O(1) 额外空间。
准备 · 首尾出发:左指针 l=0 指 A,右指针 r=6 指 a。开始向中间收。
对比① · 看两端:两端都是字母,转小写:'A'→'a'、'a'→'a'。比一下。
对比① · 相等 → 内收:'a' == 'a',这一对通过,l 右移、r 左移。
l=1 是 '?' · 跳过(负例):l 指向 '?',不是字母数字。不比较,只让 l 前进到 2——r 原地不动。这就是「跳过杂质」的负例动作。
r=5 是 '?' · 跳过(负例):r 也指向 '?',同样只退 r 到 4、不比较。现在 l=2、r=4 都落在字母上了。
对比② · 看两端:l=2 是 'b'、r=4 是 'b',两边都落在字母上,可以比了。
对比② · 相等 → 内收:'b' == 'b',通过!内收:l→3、r→3。
l == r · 相遇 → true:l、r 在中间的 C 相遇(中点字符自己和自己对称,无需比)。全程每一对都相等,返回 true。
回文类问题的通用套路:左右指针向中间走、逐对比较;遇到要忽略的字符就只移动那侧的指针。
边界三连:三种边界先想清楚。
面试官常追问:三个高频追问,答法记牢。
参考代码
class Solution: def isPalindrome(self, s): l, r = 0, len(s) - 1 while l < r: while l < r and not s[l].isalnum(): l += 1 # 跳过非字母数字 while l < r and not s[r].isalnum(): r -= 1 if s[l].lower() != s[r].lower(): # 忽略大小写 return False l += 1; r -= 1 return True复杂度
- 时间复杂度:O(n),每个字符最多看一次
- 空间复杂度:O(1),原地双指针
可套用的代码模板
记住骨架:两端向内、跳过无关项、规范化后比较、不等即假。改一下「跳过」和「规范化」规则就能套各种回文判定。
Python
l, r = 0, n - 1while l < r: while l < r and 该跳过(s[l]): l += 1 while l < r and 该跳过(s[r]): r -= 1 if 规范化(s[l]) != 规范化(s[r]): return False l += 1; r -= 1return True易错点
面试追问把动画讲成自己的话
追问核心思路是什么?
追问先清洗成新串再判可以吗?
追问判字母数字/转小写要注意什么?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两数之和 II
LeetCode 167 · 中等 · 沿着 双指针 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题