leetcode20——有效的括号——java实现

题目要求:
在这里插入图片描述

分析:
有一种优美的数据结构,叫栈(stack),这道题就是用这种美丽的数据结构来解决的。

拿到题目之后,我们需要先对题目进行分析。

先看第一个要求:
在这里插入图片描述
这个操作简单,我们可以直接利用计数来解决,设置三种不同的计数器,当遇到’(’, ‘[’, '{'时就令其各自的计数器+1,然后遇到它们的另一半时令计数器-1,到最后的时候看看计数器的值是不是0就OK了。

但是题目是永远不会这么简单滴~它给出了第二个要求:
在这里插入图片描述
需要按照正确的顺序闭合,意思就是,就算你左半边跟右半边的个数相等,如果你随便排,照样要返回false。如:) ( ] } { [,这里左半边右半边个数都相等,但是它就不是有效括号。

为了解决这个问题,我们就要使用先进后出的栈
具体思路为:

  1. 将这个字符串中的每一个字符进行遍历,一旦遇到左半边的括号’(’, ‘[’, ‘{’,就将它们入栈;
  2. 在遍历的过程中,如果遇到右半边的括号’)’, ‘]’, ‘}’,则将它们与栈顶的括号进行匹配,如果能匹配得上,则继续遍历后面的,如果匹配不上,就直接不用做了,返回false就好了;
  3. 当遍历完整个字符串中的字符后,如果这个栈已经变成空栈了,证明所有的括号都已经匹配成功,说明是有效括号。

具体代码如下:

class Solution {
public static boolean isValid(String s) {
  Stack<Character> stack = new Stack<>();
        for(char c : s.toCharArray()) {
            switch(c) {
                case ')':
                    if(stack.isEmpty() || stack.pop() != '(')
                        return false;
                    break;
                case '}':
                    if(stack.isEmpty() || stack.pop() != '{')
                        return false;
                    break;
                case ']':
                    if(stack.isEmpty() || stack.pop() != '[')
                        return false;
                    break;
                default:
                    stack.push(c);
                    break;
            }
        }
    return stack.isEmpty();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值