给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
解法一:
class Solution {
public:
bool backspaceCompare(string s, string t) {
if (Build(s) == Build(t)) {
return true;
}
else {
return false;
}
}
string Build(string str) {
string ret;
for (char ch : str) { // 遍历字符串:char ch : str
if (ch != '#') {
ret.push_back(ch);
}
else if (!ret.empty()) { // 判断容器是否为空
ret.pop_back();
}
}
return ret;
}
};
解法二:
我们定义skip 表示当前待删除的字符的数量。每次我们遍历到一个字符:
若该字符为退格符,则我们需要多删除一个普通字符,我们让 \textit{skip}skip 加 1;
若该字符为普通字符:
若 skip 为 0,则说明当前字符不需要删去;
若 skip 不为 0,则说明当前字符需要删去,我们让skip 减 1。
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.size() - 1, j = t.size() - 1;
int s_skip = 0, t_skip = 0; // 记录需要删除的次数
while (i >= 0 || j >= 0) {
// 先把s整理
while (i >= 0) {
if (s[i] == '#') {
s_skip++;
i--;
}
else if (s_skip > 0) { // 此时s[i] != #
s_skip--;
i--;
}
else { // skip 为0,不需要删去
break;
}
}
// t 同理
while (j >= 0) {
if (t[j] == '#') {
t_skip++;
j--;
}
else if (t_skip > 0) {
t_skip--;
j--;
}
else {
break;
}
}
// 此时双方的skip都是0,即应该进行判断(前提是都没出界)
if (i >= 0 && j >= 0) {
if (s[i] != t[j]) {
return false;
}
}
// 至少有一个出界,包含 1. 都出界(不做处理) 2. 当且仅当一个出界(返回false的第二个条件)
else {
if (i >= 0 || j >= 0) {
return false;
}
}
if (i >= 0) {
i--;
}
if (j >= 0) {
j--;
}
}
return true;
}
};