初级leetcode20题 有效的括号

解题的思路:

运用栈,找反例
1.给定的是个字符串,首先要把字符串转为字符数组一个个判断。
2找不满足闭合条件的反例即可。(]->false

解题步骤:

1.碰到左括号,直接入栈,碰到右括号,出栈,查看是否匹配即可
2.碰到右括号直接弹出栈顶元素,查看是否匹配若不匹配,找到反例,若匹配,就接着向后扫描字符
3.栈中只存储左括号,栈顶就是最新的左括号

4.当扫描完整个字符串后仍然没找到反例且当前栈为空,说明str是一个满足条件的字符串

代码

public class Num20_isValidStr {
    public  boolean isValid(String s){
        Stack<Character> stack = new Stack<>();
        //将字符串转为字符
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {
            //c全是左括号,直接入栈
            stack.push(c);
        }else{
            //此时碰到了右括号,弹出栈顶元素查看是否匹配
            //边界条件,stack.pop stack不为空
           if(stack.isEmpty()) {
               //右括号是第一个碰到的字符,没有左括号和他闭合,一点是false
               return false;
           }
           char top = stack.pop();
           //找反例
            if(c == ')' && top != '(') {
                //找到反例
                return false;
            } if(c == ']' && top != '[') {
                //找到反例
                return false;
            } if(c == '}' && top != '{') {
                //找到反例
                return false;
            }

            }

        }//若栈不为空,左括号大于右括号
        return stack.isEmpty();
    }

}

为什么str扫描完没找到反例还要判断栈是否为空?
因为最终所有的右括号都匹配结束之后,还剩下了若干个左括号,没有办法闭合
例如

{)(   =>(没法闭合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值