【算法笔记】有效的括号&&删除字符串中的所有相邻重复项

有效的括号

问题
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

问题分析
可采用栈来解决问题,遍历字符串,遇到左括号就压入相应的右括号,然后遇到右扣号如果与当前栈顶符号相同,就弹出,顺利执行完后栈为空就说明字符串有效。

字符串无效,不匹配的情况:

  • 左括号多余,遍历结束后,栈不为空
  • 扣号不匹配,遍历到右扣号时与当前栈顶符号不同
  • 右方向的扣号多余,遍历到右扣号时栈为空

代码

public boolean isValid(String s) {

    Stack<Character> stack=new Stack();

    for(int i=0;i<s.length();i++){
        //压入对应匹配的右括号
        if(s.charAt(i)=='(')  stack.push(')');
        else if(s.charAt(i)=='{')  stack.push('}');
        else if(s.charAt(i)=='[') stack.push(']');
        //栈为空右扣号多了,或者没有匹配的字符括号
        else if(stack.isEmpty()||stack.peek()!=s.charAt(i)) return false;
        //stack.top与s.charAt(i)相等时,弹出元素
        else stack.pop();
    }

    //栈为空返回ture,不为空返回false
    return stack.isEmpty();

}

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

问题
给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

问题分析
删除相邻的重复项,可使用栈来处理,遍历字符串,将每个字符依次压栈,在压栈过程中判断栈顶元素是否与其相同,是则表示这两个元素是相邻重复项,弹出栈顶元素,并且不压入这个字符。

代码

public String removeDuplicates(String S) {
    Stack<Character> stack=new Stack();

    for(int i=0;i<S.length();i++){
        //判断是否有相邻重复项
        if(!stack.isEmpty()&&stack.peek().equals(S.charAt(i))){
            stack.pop();
        }
        else{
            stack.push(S.charAt(i));
        }
    }


    StringBuilder result=new StringBuilder();
    while(!stack.isEmpty()){
        result.append(stack.pop());
    }
    return result.reverse().toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值