echo

任生命穿梭 时间的角落

0%

比较含退格的字符串

844. 比较含退格的字符串

给定 ST 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

1
2
3
输入:S = "ab#c", T = "ad#c"
输出:true
解释:S 和 T 都会变成 “ac”。

示例 2:

1
2
3
输入:S = "ab##", T = "c#d#"
输出:true
解释:S 和 T 都会变成 “”。

示例 3:

1
2
3
输入:S = "a##c", T = "#a#c"
输出:true
解释:S 和 T 都会变成 “c”。

示例 4:

1
2
3
输入:S = "a#c", T = "b"
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。

提示:

  1. 1 <= S.length <= 200

  2. 1 <= T.length <= 200

  3. ST 只含有小写字母以及字符 '#'

    进阶:

  • 你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

一个字符是否被删掉取决于它后面是否有#号,我们逆序遍历字符串,就可以立即确定当前字符是否会被删掉。

使用 s 记录字符串 S 中 # 号的数量,从后往前遍历每个字符:

  • 当前字符为 # 号,我们要多删除一个字符,s 加一;
  • 当前字符不是 # 号:
    • 若 s 大于 0 ,则删去当前字符;
    • 若 s 等于 0 ,当前字符不需要删除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class Solution {
public boolean backspaceCompare(String S, String T) {
int s = 0, t = 0;
for(int i = S.length() - 1, j = T.length() - 1; i >= 0 || j >= 0;){
//去掉 S 尾部需要删除的字符
while(i >= 0){
if(S.charAt(i) == '#'){
++s;
--i;
}else if(s > 0){
--s;
--i;
}else{
break;
}
}
//去掉 T 尾部需要删除的字符
while(j >= 0){
if(T.charAt(j) == '#'){
++t;
--j;
}else if(t > 0){
--t;
--j;
}else{
break;
}
}

if(i >= 0 && j >= 0){
//判断两个字符是否相等
if(S.charAt(i) != T.charAt(j)){
return false;
}
}else{
//有一个字符串已经遍历完
if(i >= 0 || j >= 0){
return false;
}
}
--i;
--j;
}
return true;
}
}
  • 时间复杂度O(n)
  • 空间复杂度O(1)