删除字符串中相邻的重复项

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

1
2
3
4
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"

提示:

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public String removeDuplicates(String s) {
char[] charArr = s.toCharArray();
Stack<Character> st = new Stack();
for(int i = 0; i < charArr.length; i++){
if(st.isEmpty() || charArr[i] != st.peek()){
st.push(charArr[i]);
}else if(st.peek() == charArr[i]){
st.pop();
}
}
int k = st.size()-1;
char[] ans = new char[k+1];
//把栈转换为字符串
while(!st.isEmpty()){
ans[k--] = st.pop();
}
return new String(ans);
}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

直接拿字符串作为栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public String removeDuplicates(String s) {
StringBuilder sb = new StringBuilder();
char[] charArr = s.toCharArray();

for(int i = 0; i < charArr.length; i++){
if(sb.length() == 0 || charArr[i] != sb.charAt(sb.length()-1)){
sb.append(charArr[i]);
}else if(sb.charAt(sb.length() - 1) == charArr[i]){
sb.deleteCharAt(sb.length() - 1);
}
}

return sb.toString();
}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

删除字符串中相邻的重复项
http://example.com/2023/10/09/算法/队列和栈/5. 删除字符串中的所有相邻重复项/
作者
PALE13
发布于
2023年10月9日
许可协议