描述
给定 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 只含有小写字母以及字符 ‘#’。
思路
解法一
借用两个栈,这里直接用字符串来的,c++里面字符串有栈的作用。从前往后扫描输入字符串,不为空遇到#,出栈一个字符,遇到字母,入栈。最后比较构造的两个字符串是否相等。
class Solution {
public:
bool backspaceCompare(string S, string T) {
string s1,t1;
s1=f(S);
t1=f(T);
return s1==t1;
}
string f(string t){
string s1;
for(auto a:t){
if(a=='#'){
if(!s1.empty())s1.pop_back();
}
else{
s1.push_back(a);
}
}
return s1;
}
};
这是用不用字符串用char栈的解法。
class Solution {
public:
bool backspaceCompare(string S, string T) {
stack<char> s1;
stack<char> s2;
f(s1,S);f(s2,T);
if(s1.size()!=s2.size())return false;
while(!s1.empty()){
if(s1.top()!=s2.top())return false;
s1.pop(),s2.pop();
}
return true;
}
void f(stack<char> &st,string s){
for(auto a:s){
if(a=='#'){
if(!st.empty()){
st.pop();
}
}
else{
st.push(a);
}
}
}
};
解法二
我们从后往前看,如果遇到的是字母,这个字母肯定是不会被退格给删除的,如果遇到的是#,我们就需要跳过下一个字母字符。
class Solution {
public:
bool backspaceCompare(string S, string T) {
int s=S.size()-1;
int t=T.size()-1;
int c1=0,c2=0;
while(s>=0||t>=0){
while(s>=0){
if(S[s]=='#')c1++,s--;
else if(c1>0)c1--,s--;
else break;
}
while(t>=0){
if(T[t]=='#')c2++,t--;
else if(c2>0)c2--,t--;
else break;
}
if(s>=0&&t>=0&&S[s]!=T[t])return false;//
if((s>=0)!=(t>=0))return false;//字母和空比较
s--,t--;
}
return true;
}
};