给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
一开始没有理解什么是退格,呜呜呜!!!
而且做这道题之前我没有仔细考虑,我应该先思考用什么数据结构能比较高效的解决问题,我一来就是很暴力的做法,也就是我的笨办法。花的时间多,bug也多,一点一点的调试出来了,就感觉很亏,呜呜呜!!!
解法一:暴力
思路:设两个动态数组list 和list2,一个负责字符串S,一个负责T。
先将字符串的元素复制一份给动态数组,然后循环遍历去找“#”号,然后根据它所处的位置来进行操作。
细节:如果“#”在第一位,或者很多个“#”相连在一起,那么考虑在上面的操作完之后,进行“#”的清除。
public boolean backspaceCompare(String S, String T) {
ArrayList<Character> list = new ArrayList<>();
ArrayList<Character> list2 = new ArrayList<>();
for (int i = 0; i < S.length(); i++) {
list.add(S.charAt(i));
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == '#' && i != 0) {
list.remove(i);
list.remove(i - 1);
i = -1;
}
}
for (int i = 0; i < T.length(); i++) {
list2.add(T.charAt(i));
}
for (int i = 0; i < list2.size(); i++) {
if (list2.get(i) == '#' && i != 0) {
list2.remove(i);
list2.remove(i - 1);
i = -1;
}
}
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == '#') {
list.remove(i);
}
}
for (int i = 0; i < list2.size(); i++) {
if (list2.get(i) == '#') {
list2.remove(i);
}
}
return list.equals(list2);
}
解法二:Stack
"#"号及其前面的符号都不能存入栈
public boolean backspaceCompare2(String S, String T) {
Stack<Character> stackS = new Stack<>();
Stack<Character> stackT = new Stack<>();
for (int i = 0; i < S.length(); i++) {
if (S.charAt(i) != '#') {
stackS.add(S.charAt(i));
} else if (!stackS.isEmpty()) {
stackS.pop();
}
}
for (int i = 0; i < T.length(); i++) {
if (T.charAt(i) != '#') {
stackT.add(T.charAt(i));
} else if (!stackT.isEmpty()) {
stackT.pop();
}
}
return stackS.equals(stackT);
}
这里可以进行优化一下:将重复的部分写在一个函数里面,调用函数
public boolean backspaceCompare3(String S, String T) {
return compare(S).equals(compare(T));
}
public String compare(String S) {
Stack<Character> stack = new Stack<>();
for (char c : S.toCharArray()) {
if (c != '#') {
stack.add(c);
} else if (!stack.isEmpty()) {
stack.pop();
}
}
return String.valueOf(stack);
}
补充两个函数:
1.static String valueOf(Object obj) 返回的 Object参数的字符串表示形式。
2. boolean equals(Object anObject) 将此字符串与指定的对象比较。