leetcode844

42 阅读1分钟

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;

}

};

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--;

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