844.比较含退格的字符串
思路1(StringBuilder):
这种方法是 O(M+N) 复杂度。M,N分别为字符串s和t的长度
new出StringBuilder对象,此时为空,根据 # 判断何时应该往里面 append,以及何时 delete,最后两个进行比较即可
注意:
注意范围不能越界
代码实现
class Solution {
public boolean backspaceCompare(String s, String t) {
return build(s).equals(build(t));
}
private String build(String str) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch != '#') {
stringBuilder.append(ch);
} else {
if (stringBuilder.length() > 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
}
}
return stringBuilder.toString();
}
}
思路2(双指针):
两个字符串分别定义指针在末尾,从后往前移动,遇到#则左移两次
但是会碰到 ## 这种情况,所以我们要先保存 # 的个数,再根据个数移动
代码实现
class Solution {
public boolean backspaceCompare(String s, String t) {
int i = s.length() - 1;
int j = t.length() - 1;
int sSkipNum = 0;
int tSkipNum = 0;
while (true) {
while (i >= 0) {
if (s.charAt(i) == '#') {
sSkipNum++;
} else {
if (sSkipNum > 0) {
sSkipNum--;
} else {
break;
}
}
i--;
}
while (j >= 0) {
if (t.charAt(j) == '#') {
tSkipNum++;
} else {
if (tSkipNum > 0) {
tSkipNum--;
} else {
break;
}
}
j--;
}
if (i < 0 || j < 0) break;//其中有一个遍历完即可退出循环
if (s.charAt(i) != t.charAt(j)) return false;//对应的字符不相等
i--;//往前移一位
j--;//往前移一位
}
if (i == -1 && j == -1) return true;//只有两个字符串同时遍历完比才返回true
return false;
}
}