algorithm-base/animation-simulation/栈和队列/leetcode1047 删除字符串中的所有相邻重复项.md
2021-07-23 15:44:19 +00:00

89 lines
3.7 KiB
Java
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

> 如果阅读时发现错误或者动画不可以显示的问题可以添加我微信好友 **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
> 感谢支持该仓库会一直维护希望对各位有一丢丢帮助
>
> 另外希望手机阅读的同学可以来我的 <u>[**公众号袁厨的算法小屋**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
#### [1047. 删除字符串中的所有相邻重复项](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
今天给大家带来一个栈的经典题目删除字符串中的相邻重复项下面我们先来看一下题目描述
给出由小写字母组成的字符串 S重复项操作会选择**两个相邻且相同**的字母并删除他们
S 上反复执行重复项删除操作直到无法继续删除在完成所有重复项删除操作后返回最终字符串答案保证唯一
示例 1
> 输入abbaca
> 输出ca
我们在之前的文章中介绍过删除重复项的思想当时我们介绍的重复项可能是两个或更多今天的题目更加简单是两字母相邻且相同这个题目我们可以使用双指针思想解决用来判断两个字符是否相同但是我们这个板块的主题是栈和队列那么我们就详细介绍一下如何用栈解答这个题目
## 解题思路
我们将字符入栈然后新的字符入栈之前先于栈顶元素对比判断是否和栈顶元素一致如果一致则栈顶元素出栈指针移到下一位则就实现了去除重复元素如果和栈顶元素不同或栈为空则将当前元素入栈直至字符串遍历结束另外我们需要注意的是栈是先进后出最后我们元素出栈的时候我们需要对字符串反转一下才为我们的答案
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210320141506967.gif)
**题目代码**
Java Code:
```java
class Solution {
public String removeDuplicates(String S) {
Stack<Character> stack = new Stack<>();
char[] s = S.toCharArray();//先将字符串变成字符数组
//特殊情况
if (S.length() == 0 || S.length() == 1) {
return S;
}
//遍历数组
for (int i= 0; i<S.length(); i++) {
//为空或者和栈顶元素不同时入栈
if(stack.isEmpty() || s[i] != stack.peek()) {
stack.push(s[i]);
}
//相同出栈
else {
stack.pop();
}
}
StringBuilder str = new StringBuilder();
//字符出栈
while (!stack.isEmpty()) {
str.append(stack.pop());
}
//翻转字符并返回
return str.reverse().toString();
}
}
```
当然这个题目也可以用 set 来做大家可以随意发挥
C++ Code:
```cpp
class Solution {
public:
string removeDuplicates(string S) {
string str;
if (S.empty() || S.size() == 1) {
return S;
}
for (int i = 0; i<S.size(); i++) {
if(str.empty() || S[i] != str.back()) {
str.push_back(S[i]);
}
else {
str.pop_back();
}
}
return str;
}
};
```