Leetcode 844. 比较含退格的字符串
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
示例1
输入:S = “ab#c”, T = “ad#c”
输出:true
解释:S 和 T 都会变成 “ac”。
示例2
输入:S = “ab##”, T = “c#d#”
输出:true
解释:S 和 T 都会变成 “”。
示例3
输入:S = “a##c”, T = “#a#c”
输出:true
解释:S 和 T 都会变成 “c”。
示例4
输入:S = “a#c”, T = “b”
输出:false
解释:S 会变成 “c”,但 T 仍然是 “b”。
题目解释
从题意看,即从是‘#’为退格符,将‘#’之前的字母删除,多少个‘#’,就删除多少个字符。
解答(方法不难,但是要注意小细节)
1. 从哪个index开始删除
2. 删除多少个字符
3. 是否有足够的字母被删除,即‘#’的个数可能比前面的字母个数还要多。
4. 以下代码还有足够的空间可以优化,这个是我一边考虑情况,一边写的,beat 92.3%。
class Solution {
public:
bool backspaceCompare(string S, string T) {
if (!S.size() && !T.size())
return true;
int count = 0;
int index = -1;
for (size_t i = 0; i < S.size(); ++i) {
if (S[i] == '#') {
index = count == 0 ? i - 1 : index; // 记录要从哪里开始删除
count++; // 要删除多少个
// 如果下一个字符不是#,则可以开始删除
if (S[i + 1] != '#') {
// 如果前面字符的个数大于#号的个数
if (index + 1 > count) {
S.erase(index - count + 1, 2 * count);
i = index - count + 1;
}
else { // 如果前面字符的个数小于等于#号的个数,则直接删除全部,包括遍历到的目前的#号
S.erase(0, i + 1);
i = 0;
}
count = 0;
}
else
continue;
}
}
count = 0;
index = -1;
for (size_t i = 0; i < T.size(); ++i) {
if (T[i] == '#') {
index = count == 0 ? i - 1 : index; // 记录要从哪里开始删除
count++; // 要删除多少个
if (T[i + 1] != '#') {
if (index + 1 > count) {
T.erase(index - count + 1, 2 * count);
i = index - count + 1;
}
else {
T.erase(0, i + 1);
i = 0;
}
count = 0;
}
else
continue;
}
}
return !S.compare(T);
}
};