99
1010## 题目大意
1111
12- 给定 ` s ` 和 ` t ` 两个字符串。字符串中的 ` # ` 代表退格字符。
12+ ** 描述 ** : 给定 $s$ 和 $t$ 两个字符串。字符串中的 ` # ` 代表退格字符。
1313
14- 要求 :当它们分别被输入到空白的文本编辑器后,判断二者是否相等。如果相等,返回 ` True ` ;否则,返回 ` False ` 。
14+ ** 要求 ** :当它们分别被输入到空白的文本编辑器后,判断二者是否相等。如果相等,返回 $ True$ ;否则,返回 $ False$ 。
1515
16- 注意:如果对空文本输入退格字符,文本继续为空。
16+ ** 说明** :
17+
18+ - 如果对空文本输入退格字符,文本继续为空。
19+ - $1 \le s.length, t.length \le 200$。
20+ - $s$ 和 $t$ 只含有小写字母以及字符 ` # ` 。
21+
22+ ** 示例** :
23+
24+ - 示例 1:
25+
26+ ``` python
27+ 输入:s = " ab#c" , t = " ad#c"
28+ 输出:true
29+ 解释:s 和 t 都会变成 " ac" 。
30+ ```
31+
32+ - 示例 2:
33+
34+ ``` python
35+ 输入:s = " ab##" , t = " c#d#"
36+ 输出:true
37+ 解释:s 和 t 都会变成 " " 。
38+ ```
1739
1840## 解题思路
1941
2042这道题的第一个思路是用栈,第二个思路是使用分离双指针。
2143
22- 思路一:栈。
44+ ### 思路 1:栈
2345
2446- 定义一个构建方法,用来将含有退格字符串构建为删除退格的字符串。构建方法如下。
2547 - 使用一个栈存放删除退格的字符串。
2648 - 遍历字符串,如果遇到的字符不是 ` # ` ,则将其插入到栈中。
2749 - 如果遇到的字符是 ` # ` ,且当前栈不为空,则将当前栈顶元素弹出。
28- - 分别使用构建方法处理字符串 ` s ` 和 ` t ` ,如果处理完的字符串 ` s ` 和 ` t ` 相等,则返回 ` True ` ,否则返回 ` False ` 。
29-
30- 思路二:分离双指针。
50+ - 分别使用构建方法处理字符串 $s$ 和 $t$,如果处理完的字符串 $s$ 和 $t$ 相等,则返回 $True$,否则返回 $False$。
3151
32- 由于 ` # ` 会消除左侧字符,而不会影响右侧字符,所以我们选择从字符串尾端遍历 ` s ` 、` t ` 字符串。具体做法如下:
33-
34- - 使用分离双指针 ` left_1 ` 、` left_2 ` 。` left_1 ` 指向字符串 ` s ` 末尾,` left_2 ` 指向字符串 ` t ` 末尾。使用 ` sign_1 ` 、` sign_2 ` 标记字符串 ` s ` 、` t ` 中当前退格字符个数。
35- - 从后到前遍历字符串 ` s ` 、` t ` 。
36- - 先来循环处理字符串 ` s ` 尾端 ` # ` 的影响,具体如下:
37- - 如果当前字符是 ` # ` ,则更新 ` s ` 当前退格字符个数,即 ` sign_1 += 1 ` 。同时将 ` left_1 ` 左移。
38- - 如果 ` s ` 当前退格字符个数大于 ` 0 ` ,则退格数减一,即 ` sign_1 -= 1 ` 。同时将 ` left_1 ` 左移。
39- - 如果 ` s ` 当前为普通字符,则跳出循环。
40- - 同理再来处理字符串 ` t ` 尾端 ` # ` 的影响,具体如下:
41- - 如果当前字符是 ` # ` ,则更新 ` t ` 当前退格字符个数,即 ` sign_2 += 1 ` 。同时将 ` left_2 ` 左移。
42- - 如果 ` t ` 当前退格字符个数大于 ` 0 ` ,则退格数减一,即 ` sign_2 -= 1 ` 。同时将 ` left_2 ` 左移。
43- - 如果 ` t ` 当前为普通字符,则跳出循环。
44- - 处理完,如果两个字符串为空,则说明匹配,直接返回 ` True ` 。
45- - 再先排除长度不匹配的情况,直接返回 ` False ` 。
46- - 最后判断 ` s[left_1] ` 是否等于 ` s[left_2] ` 。不等于则直接返回 ` False ` ,等于则令 ` left_1 ` 、` left_2 ` 左移,继续遍历。
47- - 遍历完没有出现不匹配的情况,则返回 ` True ` 。
48-
49- ## 代码
50-
51- - 思路一:
52+ ### 思路 1:代码
5253
5354``` python
5455class Solution :
@@ -65,7 +66,31 @@ class Solution:
6566 return self .build(s) == self .build(t)
6667```
6768
68- - 思路二:
69+ ### 思路 1:复杂度分析
70+
71+ - ** 时间复杂度** :$O(n + m)$,其中 $n$ 和 $m$ 分别为字符串 $s$、$t$ 的长度。
72+ - ** 空间复杂度** :$O(n + m)$。
73+
74+ ### 思路 2:分离双指针
75+
76+ 由于 ` # ` 会消除左侧字符,而不会影响右侧字符,所以我们选择从字符串尾端遍历 $s$、$t$ 字符串。具体做法如下:
77+
78+ - 使用分离双指针 $left\underline{}1$、$left\underline{}2$。$left\underline{}1$ 指向字符串 $s$ 末尾,$left\underline{}2$ 指向字符串 $t$ 末尾。使用 $sign\underline{}1$、$sign\underline{}2$ 标记字符串 $s$、$t$ 中当前退格字符个数。
79+ - 从后到前遍历字符串 $s$、$t$。
80+ - 先来循环处理字符串 $s$ 尾端 ` # ` 的影响,具体如下:
81+ - 如果当前字符是 ` # ` ,则更新 $s$ 当前退格字符个数,即 ` sign_1 += 1 ` 。同时将 $left\underline{}1$ 左移。
82+ - 如果 $s$ 当前退格字符个数大于 $0$,则退格数减一,即 ` sign_1 -= 1 ` 。同时将 $left\underline{}1$ 左移。
83+ - 如果 $s$ 当前为普通字符,则跳出循环。
84+ - 同理再来处理字符串 $t$ 尾端 ` # ` 的影响,具体如下:
85+ - 如果当前字符是 ` # ` ,则更新 $t$ 当前退格字符个数,即 ` sign_2 += 1 ` 。同时将 $left\underline{}2$ 左移。
86+ - 如果 $t$ 当前退格字符个数大于 $0$,则退格数减一,即 ` sign_2 -= 1 ` 。同时将 $left\underline{}2$ 左移。
87+ - 如果 $t$ 当前为普通字符,则跳出循环。
88+ - 处理完,如果两个字符串为空,则说明匹配,直接返回 $True$。
89+ - 再先排除长度不匹配的情况,直接返回 $False$。
90+ - 最后判断 $s[ left\underline{}1] $ 是否等于 $s[ left\underline{}2] $。不等于则直接返回 $False$,等于则令 $left\underline{}1$、$left\underline{}2$ 左移,继续遍历。
91+ - 遍历完没有出现不匹配的情况,则返回 $True$。
92+
93+ ### 思路 2:代码
6994
7095``` python
7196class Solution :
@@ -108,3 +133,8 @@ class Solution:
108133 return True
109134```
110135
136+ ### 思路 2:复杂度分析
137+
138+ - ** 时间复杂度** :$O(n + m)$,其中 $n$ 和 $m$ 分别为字符串 $s$、$t$ 的长度。
139+ - ** 空间复杂度** :$O(1)$。
140+
0 commit comments