题目描述
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = “#a#c”
输出:true
解释:S 和 T 都会变成 “c”。
示例 4:
输入:S = “a#c”, T = “b”
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
提示:
1 <= S.length <= 200
1 <= T.length <= 200
S 和 T 只含有小写字母以及字符 ‘#’。
进阶:
你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?
双指针 O(N) 的时间复杂度和 O(1)
class Solution {
public boolean backspaceCompare(String S, String T) {
int p1 = S.length() - 1, p2 = T.length() - 1;
int skipS = 0, skipT = 0;
while (p1 >= 0 || p2 >= 0) {
while(p1>=0){
if(S.charAt(p1)=='#'){
skipS++;
p1--;
}else{
if(skipS==0) break;
else{
skipS--;
p1--;
}
}
}
while(p2>=0){
if(T.charAt(p2)=='#'){
skipT++;
p2--;
}else{
if(skipT==0) break;
else{
skipT--;
p2--;
}
}
}
// System.out.println(p1+" "+p2);
if(p1>=0 && p2 >=0){
if(S.charAt(p1) != T.charAt(p2)) return false;
}else if (p1*p2 <=0){
return false;
}
p1--;
p2--;
}
return true;
}
}
stack O(N) 的时间复杂度和 O(N)
class Solution {
public boolean backspaceCompare(String S, String T) {
Stack<Character> stack1 = new Stack<>();
for(char c:S.toCharArray()){
if(c == '#'){
if(!stack1.isEmpty()) stack1.pop();
}else{
stack1.push(c);
}
}
Stack<Character> stack2 = new Stack<>();
for(char c:T.toCharArray()){
if(c == '#'){
if(!stack2.isEmpty()) stack2.pop();
}else{
stack2.push(c);
}
}
if(stack1.size() != stack2.size()) return false;
while(!stack1.isEmpty()){
char c1 = stack1.pop();
char c2 = stack2.pop();
if(c1 != c2) return false;
}
return true;
}
}