「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
删除字符串中的所有相邻重复项
题目描述
给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在S上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后
我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
算法解析:
这道题目实质上就是一个匹配问题,相同的左右元素可以看成是一个括号,匹配成功即可删除。
本题可借助栈来解决,在解题之前我们先来复习一下栈的相关内容
栈的定义:限定仅在一端进行插入和删除操作的线性表
栈的操作特性:后进先出
栈的几个基本操作为:
1.初始化栈操作:首先创建一个空栈,并将栈顶下标top初始化为-1。
public StackTest(int stackSize){
this.top=-1;
}
2.入栈操作:
public void push(Integer elem){
if(isFull()){
return -1;
}else{
stack[++top]=elem;
}
}
3.出栈操作:
public void pop(){
if(isEmpty()){
return -1;
}else{
top--;
}
}
回到本题中,我们可以将字符串中的元素依次进行入栈出栈操作,当字符串中的元素相同时,元素出栈,这样即可删除字符串中的所有相邻重复项了。
代码解析:
class Solution {
public String removeDuplicates(String s) {
//定义栈stack
StringBuffer stack=new StringBuffer();
//对栈进行简单的初始化
int top=-1;
//对字符串进行操作
for(int i=0;i<s.length();i++){
//将字符串转换成指定索引处的char值
char c=s.charAt(i);
//当栈中有字符并且当前的字符和栈中的字符相同时进行出栈操作,反之进行入栈操作
if(top>=0&&stack.charAt(top)==c){
stack.deleteCharAt(top);
top--;
}else{
stack.append(c);
top++;
}
}
//返回最终的字符串
return stack.toString();
}
}