题目描述
给定 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)
的空间复杂度解决该问题吗?
思路
本题可以使用栈来辅助解题,题目描述符合先入后出的思想。字符串s和t分别对应一个栈,遍历两个字符串,如果遇到普通字符,就入栈;如果遇到'#'且栈不为空,就出栈。最后比较两个栈内的元素是否相等。
代码
C++版:
class Solution {
public:
bool backspaceCompare(string s, string t) {
// 可以使用栈,当遇到#的时候进行弹出操作
// 如果对空文本输入退格字符,文本继续为空,也就是不操作
stack<char> char_stack1; //字符串s
stack<char> char_stack2; //字符串t
for(int i=0;i<s.size();i++){
if(s[i]!='#'){
char_stack1.push(s[i]);
}
else if(s[i]=='#' && char_stack1.size()>0){ // 保证栈有元素可以弹出
char_stack1.pop();
}
}
for(int j=0;j<t.size();j++){
if(t[j]!='#'){
char_stack2.push(t[j]);
}
else if(t[j]=='#' && char_stack2.size()>0){
char_stack2.pop();
}
}
if(char_stack1.size()!=char_stack2.size()){
// 长度不同,直接输出false
return false;
}
// 栈在pop后长度会变,使用while比for更好
while(char_stack1.size()>0){
if(char_stack1.top()==char_stack2.top()){
char_stack1.pop();
char_stack2.pop();
}else{
return false;
}
}
return true;
}
};
Python版:
class Solution:
def backspaceCompare(self, s: str, t: str) -> bool:
stack1=[]
stack2=[]
i=0
j=0
while i<len(s):
if s[i]!='#':
stack1.append(s[i])
elif s[i]=='#' and len(stack1)>0:
stack1.pop()
i+=1
while j<len(t):
if t[j]!='#':
stack2.append(t[j])
elif t[j]=='#' and len(stack2)>0:
stack2.pop()
j+=1
return stack1==stack2
需要注意的地方
1.本题也可以使用快慢双指针来解决,思路如下:
首先快慢指针并行遍历字符串,当遇到'#'时,快指针继续向前,而慢指针回退两位。每一次操作都要将慢指针指向的字符替换为快指针指向的字符,快慢指针指向同一位置时可以不用替换。遍历完成后,[0,slow)即为退格后的字符串。最终比较两个退格后的字符串即可。
2.在Python中,可以使用List来作为栈,其中入栈操作为append(),出栈操作为pop()(默认删除最后一个元素并返回其值)。