一、1047.删除字符串中的所有相邻重复项
题目描述:
字符串中相邻字符相同,就要删去,删去之后相邻字符相同也要删去。
解题思路:
- 我们使用栈来存储,从前遍历字符串的字符。
- 拿到一个字符,就看栈顶元素是否相同,如果相同就出栈,不同就入栈。
- 注意在看栈顶元素前,要看栈是不是空。
- 这里可以使用数组来代替栈。
解题代码:
// 时间复杂度:O(n)
// 空间复杂度:O(n)
class Solution {
public String removeDuplicates(String s) {
StringBuffer ret = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (ret.length() > 0 && s.charAt(i) == ret.charAt(ret.length() - 1)) {
ret.deleteCharAt(ret.length() - 1);
} else {
ret.append(s.charAt(i));
}
}
return ret.toString();
}
}
二、844.比较含退格的字符串
题目描述:
当字符串中是'#'的时候就将前一个字符删去,删去之后再遇到'#'也要删去前一个字符。判断两个字符串按照上面规则运算后,是否相同。
解题思路:
- 这和上一道题是一道题,只不过判断条件从前一个字符是否相等,变成了当前字符是不是'#'。
- 我们只需要封装一个方法进行删除就行,最后判断两个字符串调用了方法后是否内容相同即可。
解题代码:
// 时间复杂度:O(n)
// 空间复杂度:O(n)
class Solution {
public boolean backspaceCompare(String s, String t) {
return backspace(s).equals(backspace(t));
}
// 返回处理#后的结果
String {
();
( ; i < s.length(); i++) {
(ret.length() > && s.charAt(i) == ) {
ret.deleteCharAt(ret.length() - );
}
(s.charAt(i) != ) {
ret.append(s.charAt(i));
}
}
ret.toString();
}
}


