LeetCode20--有效的括号

题目描述

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

有效字符串需满足:

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

示例

示例 1:
输入:s = “()[]{}”
输出:true

示例 2:
输入:s = “(]”
输出:false

示例 3:
输入:s = “([)]”
输出:false

示例 4:
输入:s = “{[]}”
输出:true

Notice

1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

思路

首先我们只考虑一种情况,即只存在()这一种情况分析

//首先我们只考虑一种情形,只包含“(”这种情况,代码如下:
    public boolean isValid(String s) {
        int n = s.length();
        if(n % 2 == 1){//如果字符串长度为奇数,那我们直接判断返回false
            return false;
        }
        ArrayDeque<Character> stack = new ArrayDeque<>();//定义一个栈,满足先进来的后处理的特性
        for(char c : s.toCharArray()){//for循环来遍历字符数组,用字符c来接收
            if(c == '('){//如果遍历的字符为左括号,就让该字符进栈
                stack.push(c);
            }else{//此时表明遇到了右括号,因为这里我们只考虑一种小括号的情况,当遇到右括号的时候,出栈即可
                if(stack.isEmpty()){//这里的判断表明当栈里左右括号闭合后,还有右括号,此时我们也要返回false
                    return false;
                }
                stack.pop();//这里的情况是栈里左括号还没闭合完,遇到右括号直接出栈即可
            }
        }
        //这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
          当遍历完字符串后,栈里没有元素了(栈为空),就返回true
       return stack.isEmpty();

    }
    

当主体代码完成后,我们再考虑题目要求的三种情形

  public boolean isValid(String s) {
         if(s.length() % 2 == 1){
             return false;
         }
         ArrayDeque<Character> stack = new ArrayDeque<>();
         for(char c : s.toCharArray()){
             if(c == '(' || c =='{' || c == '['){//当遍历的字符都是左括号时,都将该字符进栈
                 stack.push(c);
             }else{//这里是遇到右括号的情形
                 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;
                 }
             }
         }
         //这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
         // 当遍历完字符串后,栈里没有元素了(栈为空),就返回true
         return stack.isEmpty();

     }

提交代码运行如下:
在这里插入图片描述

代码扩展性优化,使用map来避免重复的if判断

//代码扩展性优化
     public boolean isValid(String s) {
         if(s.length() % 2 == 1){
             return false;
         }
         Map<Character,Character> map = new HashMap<>();
         map.put('(',')');
         map.put('[',']');
         map.put('{','}');

          ArrayDeque<Character> stack = new ArrayDeque<>();
         for(char c : s.toCharArray()){
             if(map.containsKey(c)){//当遍历的字符都是左括号时,都将该字符进栈
                 stack.push(c);
             }else{//这里是遇到右括号的情形
                 if(stack.isEmpty()){//首先判断这里的栈是否为空,若为空,此时还有右括号,则要返回false
                     return false;
                 }
                 char top = stack.pop();//这里不能单纯的出栈,因为需要进行判断右括号是否同左括号是同一类型的,这里我们
                 //取出栈顶的元素进行如下判断
                 if(c != map.get(top)){
                     return false;
                 }
                 
             }
         }
         //这里返回的为true还是false就只需要看栈里的元素是否为空,当遍历完字数串后,栈里还剩下元素(不为空),就返回false,
         // 当遍历完字符串后,栈里没有元素了(栈为空),就返回true
         return stack.isEmpty();

     }

运行截图如下
在这里插入图片描述

总结一下,map虽然使得代码的扩展性有所增加,但是时间复杂度和空间复杂度依然是O(n),因为它需要去map里面进行遍历查找,相比于上面的if判断,多了一轮查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值