LeetCode -844. 比较含退格的字符串(栈、双指针)
方法一(栈):
如果它是退格符,那么我们将栈顶弹出;
如果它是普通字符,那么我们将其压入栈中。
class Solution {
public boolean backspaceCompare(String S, String T) {
return build(S).equals(build(T));
}
private String build(String str) {
StringBuffer sb = new StringBuffer();
int length = str.length();
for (int i = 0; i < length; i++) {
char ch = str.charAt(i);
if (ch != '#'){
sb.append(ch);
}else {
if (sb.length() > 0){
sb.deleteCharAt(sb.length() - 1);
}
}
}
return sb.toString();
}
}
方法二:双指针
一个字符是否会被删掉,只取决于该字符后面的退格符,而与该字符前面的退格符无关。因此当我们逆序地遍历字符串,就可以立即确定当前字符是否会被删掉。
class Solution {
public boolean 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.charAt(i) == '#') {
skipS++;
i--;
} else if (skipS > 0) {
skipS--;
i--;
} else {
break;
}
}
while (j >= 0) {
if (T.charAt(j) == '#') {
skipT++;
j--;
} else if (skipT > 0) {
skipT--;
j--;
} else {
break;
}
}
if (i >= 0 && j >= 0) {
if (S.charAt(i) != T.charAt(j)) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
i--;
j--;
}
return true;
}
}