题目描述
思路解析动画文字版
记住两个动作:清洗(留字母数字、转小写),双指针从两头夹向中间一对对比。下面每一帧都在套它。
先把原串清洗:逗号、冒号、空格都删掉,大写 A、E 变成小写 a、e。得到上面这 13 个干净字符,接下来就在它上面比对。
左指针 l 落在最左边的下标 0,右指针 r 落在最右边的下标 12。两人准备从两头往中间一对对地比。
第一对里,左指针 l 在下标 0,它的字符是 'a'(高亮这位)。
右指针 r 在下标 12,它的字符是 'a'。现在把这一对的两个字符 'a' 和 'a' 拿来比。
'a' 和 'a' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
第二对里,左指针 l 在下标 1,它的字符是 'b'(高亮这位)。
右指针 r 在下标 11,它的字符是 'b'。现在把这一对的两个字符 'b' 和 'b' 拿来比。
'b' 和 'b' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
第三对里,左指针 l 在下标 2,它的字符是 'c'(高亮这位)。
右指针 r 在下标 10,它的字符是 'c'。现在把这一对的两个字符 'c' 和 'c' 拿来比。
'c' 和 'c' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
第四对里,左指针 l 在下标 3,它的字符是 'd'(高亮这位)。
右指针 r 在下标 9,它的字符是 'd'。现在把这一对的两个字符 'd' 和 'd' 拿来比。
'd' 和 'd' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
第五对里,左指针 l 在下标 4,它的字符是 'e'(高亮这位)。
右指针 r 在下标 8,它的字符是 'e'。现在把这一对的两个字符 'e' 和 'e' 拿来比。
'e' 和 'e' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
第六对里,左指针 l 在下标 5,它的字符是 'f'(高亮这位)。
右指针 r 在下标 7,它的字符是 'f'。现在把这一对的两个字符 'f' 和 'f' 拿来比。
'f' 和 'f' 相等,这一对通过。左指针往右挪一格、右指针往左挪一格,去比更靠中间的下一对。
左右指针在中间相遇(下标 6 这一格无需再比)。一路上每一对字符都相等,所以它是回文,返回 true。
三个高频追问:为何先清洗、空串边界、以及怎么省到 O(1) 空间。
参考代码
def isPalindrome(s): t = [c.lower() for c in s if c.isalnum()] # 清洗:留字母数字+转小写 l, r = 0, len(t) - 1 while l < r: if t[l] != t[r]: # 有一对不相等 return False l += 1 # 两指针一起往中间挪 r -= 1 return True复杂度
- 时间:O(n),清洗扫一遍、双指针再扫一遍,都是线性,n 是字符串长度
- 空间:O(n),清洗后的字符序列要额外存一份;若原地跳过非字母数字可优化到 O(1)
易错点
面试追问把动画讲成自己的话
追问为什么要先清洗再判断?
追问空字符串或清洗后为空,算回文吗?
追问能不能不额外建清洗后的串,省到 O(1) 空间?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两数之和 II
LeetCode 167 · 中等 · 沿着 双指针 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题