一:题目
二:思路+代码
1:利用栈
(1):思路
1.利用栈 我们将字符串中的单个元素都入栈 当遇到’#'的时候将将栈顶元素弹出
(2):上码(方法一)
class Solution {
public:/**思路:1.利用栈 我们将字符串中的单个元素都入栈 当遇到'#'的时候将将栈顶元素弹出*/bool backspaceCompare(string s, string t) {stack<char> 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;}};
2:双指针
(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--;elsebreak;}i--;//往前走一个字符}while(j >= 0){if(t[j] == '#')tkipNum++;else{if(tkipNum > 0)tkipNum--;elsebreak; } j--;}//S或者T到头了,那么此时的 i 和 j 为 -1 因为我们是比较单个字符的 if(i < 0 || j < 0)break;//如果两个字符不相等则可以直接返回 trueif(s[i] != t[j])return false; i--;//比如比较的第一个字符相等(逆序)j--;}if(i == -1 && j == -1)return true;elsereturn false;}
};
菜鸡杰又水了一道题 我以为我会双指针了 直到我遇到了这道题 梦醒了 晚安 晚安 加油陌生人!!!