给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = "ab#c", t = "ad#c" 输出:true 解释:s 和 t 都会变成 "ac"。
示例 2:
输入:s = "ab##", t = "c#d#" 输出:true 解释:s 和 t 都会变成 ""。
示例 3:
输入:s = "a#c", t = "b" 输出:false 解释:s 会变成 "c",但 t 仍然是 "b"。
提示:
1 <= s.length, t.length <= 200
s
和t
只含有小写字母以及字符'#'
进阶:
- 你可以用
O(n)
的时间复杂度和O(1)
的空间复杂度解决该问题吗?
遇到这道题,我第一反应是利用栈,顺序进栈而后遇到'#'则出栈,以下则用StringBuilder实现进栈与出栈的过程
class Solution {
public boolean backspaceCompare(String s, String t) {
return getResult(s).equals(getResult(t));
}
public String getResult(String res) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < res.length(); i++){
if(res.charAt(i) != '#') {
sb.append(res.charAt(i)); // 进栈
}else {
if(sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1); // 出栈
}
}
}
return sb.toString();
}
}
这里利用StringBuilder的append 和 deleteCharAt 方法实现了元素的进栈和出栈。但我们细细思考(看过题解) 会发现其实还有其他解法,双指针就是一个效率很高的解法。
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;
}
}
// **********************************************************
// 这里从后往前依次比较,对应位置字符不同则返回false
if(i >= 0 && j >= 0) {
if (s.charAt(i) != t.charAt(j)) {
return false;
}
}else { // 这里则是为了避免ca#abc 和 abc 可能返回true的错误
if(i >= 0 || j >= 0) {
return false;
}
}
i--;
j--;
}
return true;
}
}