力扣:844.比较含退格的字符串
题目:
本编辑器后,请你判断二者是否相等。# 代表退格字符。
如果相等,返回 true ;否则,返回 false 。
注意:如果对空文本输入退格字符,文本继续为空。
官方给了两种
①:用栈
②:双指针
栈代码如下:
class Solution {
public:
bool backspaceCompare(string s, string t) {
return build(s) == build(t);
}
string build(string str){
string ret;
for(char ch:str){
if(ch != '#'){
ret.push_back(ch);
}
else if(!ret.empty()){
ret.pop_back();
}
}
return ret;
}
};
主要要提及的就是栈的实现:把字符串当做栈
通过字符串的 push_back 方法和pop_back 方法实现入栈和出栈。
思路:将S、T 字符串转换为正常字符串(用栈实现)再直接比较两个正常字符串。
双指针代码如下:
class Solution {
public:
bool backspaceCompare(string S, string T) {
int i = S.length() - 1, j = T.length() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (S[i] == '#') {
skipS++, i--;
} else if (skipS > 0) {
skipS--, i--;
} else {
break;
}
}
while (j >= 0) {
if (T[j] == '#') {
skipT++, j--;
} else if (skipT > 0) {
skipT--, 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;
}
};
双指针思路:
一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。因此当我们逆序地遍历字符串,就可以立即确定当前字符是否会被删掉。
每次我们让两指针逆序地遍历两字符串,直到两字符串能够各自确定一个字符,然后将这两个字符进行比较。
两者相比较用栈简单的多。