给定 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 <= 200s和t只含有小写字母以及字符'#'
进阶:
- 你可以用
O(n)的时间复杂度和O(1)的空间复杂度解决该问题吗?
解题思路:栈思想
这道题也是一样,因为我们需要记录下当前元素前面的字符情况,所以可以使用栈的思想来解决问题,但是我们并不需要真的使用一个栈,而是可以用题目要求的 string 来模拟栈的操作,即先进后出,这样子就能达到题目的进阶的空间复杂度的要求!
解题过程还是比较简单的:
- 先将两个字符串通过栈的思想,生成各自去掉退格后的新字符串
- 最后比较两个新字符串是否相同即可
需要注意的是,在 pop 元素的时候,需要判断栈即字符串是否为空,是的话是不能进行 pop 操作的!
class Solution {
public:
bool backspaceCompare(string s, string t) {
// 先将两个字符串通过栈变成去掉退格的字符串
string tmps, tmpt;
for(int i = 0; i < s.size(); ++i)
{
if(s[i] != '#')
tmps.push_back(s[i]);
else if(tmps.size() != 0) // 注意需要判断栈(字符串)元素不为空的情况
tmps.pop_back();
}
for(int i = 0; i < t.size(); ++i)
{
if(t[i] != '#')
tmpt.push_back(t[i]);
else if(tmpt.size() != 0) // 注意需要判断栈(字符串)元素不为空的情况
tmpt.pop_back();
}
// 比较两者是否相同
return tmps == tmpt;
}
};