class Solution {
public:
/**
思路:
1.利用栈 我们将字符串中的单个元素都入栈 当遇到'#'的时候将将栈顶元素弹出
*/
bool backspaceCompare(string s, string t) {
stack s1,s2;
for(char str:s){
if(str != '#'){
s1.push(str);
}else if(!s1.empty()){
s1.pop();
}
}
for(char str:t){
if(str != '#'){
s2.push(str);
}else if(!s2.empty()){
s2.pop();
}
}
return s1 == s2;
}
};
(3):方法二
class Solution {
public:
/**
思路:
1.利用栈 我们将字符串中的单个元素都入栈 当遇到'#'的时候将将栈顶元素弹出
*/
bool backspaceCompare(string s, string t) {
return text(s) == text(t);
}
string text (string str){
string s;
for(int i = 0; i < str.size(); i++){
if(str[i] != '#')
s.push_back(str[i]);
else if(!s.empty())
s.pop_back();
}
return s;
}
};
(1):思路
1.我们在遇到’#‘的时候 是删除其前面的元素,而与后面的元素无关,那么我们可以逆序遍历
字符串,当遇到’#‘的时候,指针就往前走,然后当kipNum为0的时候证明我们已经成功移 除一个字符(其实是模拟)
2.这里设置skipNum,tkipNUm两个变量,来记录两个字符串中的’#‘的数量,来模拟消除的过程
那么在这里双指针主要是用在来比较单个字符,就是我们遍历到最后,我们是否可以得到相同
的字符,或者是同时遍历完成,那么也会说明去除’#'前面的字符后的字符串依然相等
(2):上码
class Solution {
public:
/**
思路:
1.我们在遇到'#'的时候 是删除其前面的元素,而与后面的元素无关,那么我们可以逆序遍历
字符串,当遇到'#'的时候,指针就往前走,然后当kipNum为0的时候证明我们已经成功移 除一个字符(其实是模拟)
2.这里设置skipNum,tkipNUm两个变量,来记录两个字符串中的'#'的数量,来模拟消除的过程
那么在这里双指针主要是用在来比较单个字符,就是我们遍历到最后,我们是否可以得到相同
的字符,或者是同时遍历完成,那么也会说明去除'#'前面的字符后的字符串依然相等
*/
bool backspaceCompare(string s, string t) {
int sKipNum = 0;//记录s中'#'的数量 主要是为了模拟去除'#'前面的字符
int tkipNum = 0;//记录t中'#'的数量
//双指针
int i = s.size() - 1;//逆序
int j = t.size() - 1;
while(1){
//从后往前,消除s中的#
while(i >= 0){
if(s[i] == '#')//当遇到#的时候这个while循环就有意义了,直到skipnum == 0的时候才跳出这个循环,表示模拟删除了 # 前面的字符
sKipNum++;
else{
if(sKipNum > 0)
sKipNum--;
else
break;
}
i--;//往前走一个字符
}
while(j >= 0){
if(t[j] == '#')
tkipNum++;
else{
if(tkipNum > 0)
tkipNum--;
else
break;
}
j--;
}
//S或者T到头了,那么此时的 i 和 j 为 -1 因为我们是比较单个字符的
if(i < 0 || j < 0)
break;
//如果两个字符不相等则可以直接返回 true