方法
- 从后往前便利 *// 我们定义 skip\textit{skip}skip 表示当前待删除的字符的数量。每次我们遍历到一个字符:
// 若该字符为退格符,则我们需要多删除一个普通字符,我们让 skip\textit{skip}skip 加 111;
// 若该字符为普通字符:
// 若 skip\textit{skip}skip 为 000,则说明当前字符不需要删去;
// 若 skip\textit{skip}skip 不为 000,则说明当前字符需要删去,我们让 skip\textit{skip}skip 减 111。
class Solution {
public boolean backspaceCompare(String s, String t) {
int i = s.length() - 1, j = t.length() - 1;
int deleteS = 0, deleteT = 0;
while (i >= 0 || j >= 0) {
// 找到 s 中第一个需要比较的字符(去除 # 影响后的第一个待比较字符)
// 这种写法可以处理 adf#d###df这种累积的#
while (i >= 0) {
if (s.charAt(i) == '#') {
deleteS++;
i--;
} else if (deleteS > 0) {
deleteS--;
i--;
} else {
break;
}
}
while (j >= 0) {
if (t.charAt(j) == '#') {
deleteT++;
j--;
} else if (deleteT > 0) {
deleteT--;
j--;
} else {
break;
}
}
// 这个 if 条件的原因是:如果 index = 0 位置上为 '#',则 i, j 会为 -1
if (i >= 0 && j >= 0) {
if (s.charAt(i) != t.charAt(j)) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
// (i >= 0 && j >= 0) 为 false 情况为
// 1. i < 0 && j >= 0
// 2. j < 0 && i >= 0
// 3. i < 0 && j < 0
// 其中,第 3 种情况为符合题意情况
i--;
j--;
}
return true;
}
}