【力扣】借助栈解决匹配问题

113 阅读2分钟

「这是我参与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();
    }
}