题目来源
题目描述
题目解析
栈【用这种方法有多次错误】
class Solution {
public boolean backspaceCompare(String S, String T) {
Stack<Character> s = new Stack<>();
for (int i = 0; i < S.length(); i++){
char t = S.charAt(i);
if (t == '#' ){ // 遇到#
if (!s.empty()){ // 而且#之前有字符
s.pop(); // 删除字符
}
continue; // 退出, 就算#之前有字符这个也结束了
}
s.push(t);
}
int count = 0;
boolean flag = true;
for (int i = T.length() - 1; i > -1; i--){ // 从最后面开始
char t = T.charAt(i);
if (t == '#'){
count++;
continue;
}
// t != '#'
if (count != 0){ // 有删除行为
count--; // 这个字符无效,而且去掉了一个删除号
continue;
}
if (s.empty()){
flag = false;
break;
}
// 没有删除键盘
char a = s.pop(); // 获取S的最后一个有效字符
if (a != t){
flag = false;
break;
}
}
if (!s.empty()){
flag = false;
}
return flag;
}
}
重构字符串
分别处理每个字符串:从字符串末尾开始,遇到多少个‘#’就跳过多少字符
package com.oceanstar;
public class testC {
public static boolean backspaceCompare(String S, String T) {
return formatString(S).equals(formatString(T));
}
private static String formatString(String S){
StringBuilder sb = new StringBuilder();
char[] carr = S.toCharArray();
int count = 0;
for (int i = S.length() - 1; i > -1;i--){
if (carr[i] == '#'){ // 可能有多个#
count++;
continue;
}
if (count == 0){
sb.append(carr[i]);
}else{
count--;
}
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(backspaceCompare("ab###c", "ad#c"));
}
}