持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
题目描述
给定 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 只含有小写字母以及字符 '#'
思路
本题可以使用栈解法和使用双指针解法。
栈解法:
遍历字符串的每一个字符,如果遇到了退格符并且栈不为空就把栈顶元素出栈,如果不是退格符就把当前字符加入栈中(这里不用再额外开辟一个stack,直接使用字符串本身),最后返回这个新的字符串即退格后的字符串,然后两个字符串进行比较,得出答案。
双指针解法:
准备两个指针 i, j 分别指向 S,T 的末位字符,再准备两个变量 是s1,s2来分别存放 S,T 字符串中的 # 数量。 从后往前遍历 字符串,所遇情况有三,如下所示:
- 若当前字符是 #,则 s1自增 1;
- 若当前字符不是 #,且 s1不为 0,则 s1自减 1;
- 若当前字符不是 #,且 s1为 0,则代表当前字符不会被消除,我们可以用来和 T 中的当前字符作比较。
若对比过程出现 S, T 当前字符不匹配,则遍历结束,返回 false,若S,T 都遍历结束,且都能一一匹配,则返回 true。
代码
用栈解法
class Solution {
public:
bool backspaceCompare(string s, string t) {
int length1 = s.size(), length2 = t.size();
return build(s) == build(t);
}
string build(string s)
{
string res;
for(char ch : s)
{
if(ch != '#')
{
res.push_back(ch);
}else if(!res.empty()){
res.pop_back();
}
}
return res;
}
};
双指针解法
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
int s1 = 0, s2 = 0;
while(i >= 0 || j >= 0 )
{
while(i >= 0)
{
if(s[i] == '#')
{
i--, s1 ++;
}
else if(s1 > 0)
{
s1 --;
i --;
}
else break;
}
while(j >= 0)
{
if(t[j] == '#')
{
j--, s2 ++;
}
else if(s2 > 0)
{
s2 --;
j --;
}
else break;
}
if(i >= 0 && j >= 0)
{
if(s[i] != t[j]) return false;
}else
{
if(i >= 0 || j >= 0) return false;
}
i --;
j --;
}
return true;
}
};