题目描述
思路解析动画文字版
记住「从右往左 + skip 计数,找有效字符两两比」。为什么从右往左?因为退格只影响它左边的字符,从右扫才能当场算清谁被删。
先看 s。指针从最右第 7 位起步,带一个 skip=0。下面一格一格往左走,边走边算哪些字符真正留下来。
t 也一样,指针落在最右第 7 位、skip=0。两个串各自找「下一个有效字符」,再把这一对拿来比。
s 的第 7 位是 "e",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。s 当前化简成 "e"。
t 的第 7 位是 "e",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。t 当前化简成 "e"。
把这一对有效字符摆出来比:s 是 "e"、t 是 "e"。一样,接着找下一对。
s 的第 6 位是 "d",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。s 当前化简成 "de"。
t 的第 6 位是 "d",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。t 当前化简成 "de"。
把这一对有效字符摆出来比:s 是 "d"、t 是 "d"。一样,接着找下一对。
s 的第 5 位是退格键 #,欠一次删除,skip 加到 1。# 本身不是字符,继续往左。
s 的第 4 位是 "c",可前面还欠着退格(skip 从 1 减到 0),所以它被删掉、灰掉跳过。
s 的第 3 位是退格键 #,欠一次删除,skip 加到 1。# 本身不是字符,继续往左。
s 的第 2 位是 "b",可前面还欠着退格(skip 从 1 减到 0),所以它被删掉、灰掉跳过。
s 的第 1 位是 "a",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。s 当前化简成 "ade"。
t 的第 5 位是退格键 #,欠一次删除,skip 加到 1。# 本身不是字符,继续往左。
t 的第 4 位是退格键 #,欠一次删除,skip 加到 2。# 本身不是字符,继续往左。
t 的第 3 位是 "z",可前面还欠着退格(skip 从 2 减到 1),所以它被删掉、灰掉跳过。
t 的第 2 位是 "b",可前面还欠着退格(skip 从 1 减到 0),所以它被删掉、灰掉跳过。
t 的第 1 位是 "a",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。t 当前化简成 "ade"。
把这一对有效字符摆出来比:s 是 "a"、t 是 "a"。一样,接着找下一对。
s 的第 0 位是 "x",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。s 当前化简成 "xade"。
t 的第 0 位是 "x",此刻 skip=0、没有欠账,它就是真正留下的有效字符,标绿。t 当前化简成 "xade"。
把这一对有效字符摆出来比:s 是 "x"、t 是 "x"。一样,接着找下一对。
两个串从右扫到头,逐对有效字符全都对得上,s 化简成 "xade"、t 化简成 "xade",完全一样,返回 true。全程只用了两个指针和两个 skip 计数,没有另开字符串,空间 O(1)。
边界:开头多余的 # 自动作废、删空后是空串、两个空串相等。
两个高频追问:栈解法(O(n) 空间)对比双指针(O(1) 空间),以及为什么双指针省空间。
参考代码
class Solution: def backspaceCompare(self, s: str, t: str) -> bool: def next_char(x, i): skip = 0 while i >= 0: if x[i] == '#': skip += 1 elif skip: skip -= 1 else: return x[i], i - 1 i -= 1 return '', -1 i, j = len(s) - 1, len(t) - 1 while i >= 0 or j >= 0: a, i = next_char(s, i) b, j = next_char(t, j) if a != b: return False return True复杂度
- 时间:O(n + m),n、m 是两串长度,两个指针各把自己的串从右到左扫一遍,每个字符只看一次
- 空间:O(1),只用两个下标和两个 skip 计数器,不另开字符串或栈
易错点
面试追问把动画讲成自己的话
追问还有别的解法吗?
追问为什么双指针能做到 O(1) 空间?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
删除字符串中的所有相邻重复项
LeetCode 1047 · 简单 · 沿着 栈套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题