LeetCode 1047. 删除字符串中的所有相邻重复项
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1047. 删除字符串中的所有相邻重复项相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
public String removeDuplicates(String S) {
char[] chars = S.toCharArray();
Stack<Character> stack = new Stack<>();
int index = 0;
int length = S.length();
while (index < length) {
char current = chars[index++];
if (!stack.empty() && stack.peek() == current) {
//如果栈顶的值和当前遍历的值相同,他两直接消失
stack.pop();
} else {
//如果栈为空,或者栈顶元素和当前值不相同,就把当前值压入栈
stack.push(current);
}
}
//下面是把栈中的元素转化为字符串
StringBuilder stringBuilder = new StringBuilder(stack.size());
while (!stack.empty())
stringBuilder.append(stack.pop());
return stringBuilder.reverse().toString();
}
public String removeDuplicates(String S) {
int left = 0;
int right = 0;
int length = S.length();
char[] chars = S.toCharArray();
while (right < length) {
//先把右边的字符赋值给左边
chars[left] = chars[right];
//然后判断左边挨着的两个字符是否相同,如果相同,
//他两同时消失,也就是left往回退两步
if (left > 0 && chars[left - 1] == chars[left])
left -= 2;
++right;
++left;
}
return new String(chars, 0, left);
}
还可以使用StringBuilder,原理都是一样的,来看下代码
public String removeDuplicates(String S) {
StringBuilder stringBuilder = new StringBuilder();
char[] chars = S.toCharArray();
for (char ch : chars) {
int size = stringBuilder.length();
if (size > 0 && stringBuilder.charAt(size - 1) == ch) {
stringBuilder.deleteCharAt(size - 1);
} else {
stringBuilder.append(ch);
}
}
return stringBuilder.toString();
}
总结
这题使用栈是最容易想到的,每次只需要比较要入栈的值和栈顶元素即可,如果一样,就同时消失。当然还可以使用双端队列,他是两头都可以添加和删除的一种数据结构,具体可以看下《359,数据结构-3,队列》
以上是关于LeetCode 1047. 删除字符串中的所有相邻重复项的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode栈与队列1047. 删除字符串中的所有相邻重复项(一些题外话和做题经验!!看作对对碰游戏!!)