给定 S
和 T
两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 #
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 <= S.length <= 200
1 <= T.length <= 200
S
和 T
只含有小写字母以及字符 '#'
。
进阶:
- 你可以用
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;){ while(i >= 0){ if(S.charAt(i) == '#'){ ++s; --i; }else if(s > 0){ --s; --i; }else{ break; } } 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; } }
|