844.比较含退格的字符串
1.题目描述
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
2.题目示例
- 进阶:
- 你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
3.思路及代码
- (非进阶易懂)思路一:利用StringBuilder,每次append时检查,如果有退格,那么就删除刚刚最新加进来的即可,最后比较二者是否相同
- 代码:
class Solution {
public boolean backspaceCompare(String S, String T) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for(int i = 0; i < S.length(); i++){
if(S.charAt(i) == '#'){
if(sb1.length() == 0){
continue;
}
sb1.deleteCharAt(sb1.length() - 1);
}else{
sb1.append(S.charAt(i));
}
}
for(int i = 0; i < T.length(); i++){
if(T.charAt(i) == '#'){
if(sb2.length() == 0){
continue;
}
sb2.deleteCharAt(sb2.length() - 1);
}else{
sb2.append(T.charAt(i));
}
}
return sb1.toString().equals(sb2.toString());
}
}
- 运行结果
-
(进阶)思路:双指针,搬运官方题解,空间复杂度降为O(1)
-
代码:
class Solution {
public boolean backspaceCompare(String S, String T) {
int i = S.length() - 1, j = T.length() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (S.charAt(i) == '#') {
skipS++;
i--;
} else if (skipS > 0) {
skipS--;
i--;
} else {
break;
}
}
while (j >= 0) {
if (T.charAt(j) == '#') {
skipT++;
j--;
} else if (skipT > 0) {
skipT--;
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;
}
}
- 运行结果: