【每日算法】力扣20. 有效的括号

121 阅读1分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。

描述

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true
 ```

提示:

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


## 做题

这道题要使用到栈了,看到示例4,它还要求括号要对称,那这样做起来就比较简单了,直接遇到')]}'这三个字符,再从栈里拿出来看看是不是对称的,不是就全部放回去。

char 可以使用 Character 引用。


```JAVA
public boolean isValid(String s) {
        if(s == null || s.length() == 0 || "".equals(s)){
            return true;
        }
        Stack<Character> stack = new Stack();
        stack.push(s.charAt(0));
        Character p = null;
        for(int i = 1;i<s.length();i++){
            Character item = s.charAt(i);
            
            switch(item){
                case ']':
                    if(stack.empty()){
                        return false;
                    }
                    p = stack.peek();
                    if(!p.equals('[')){
                     return false;
                    }
                stack.pop();
                break;
                case '}':
                    if(stack.empty()){
                        return false;
                    }
                    p = stack.peek();
                    if(!p.equals('{')){
                        return false;
                    }
                    stack.pop();
                    break;
                case ')':
                    if(stack.empty()){
                        return false;
                    }
                    p = stack.peek();
                    if(!p.equals('(')){
                        return false;
                    }
                    stack.pop();
                    break;
                default:
                    stack.push(item);
            }
        }
	//当 stack 中没有数据,说明左括号都出来了,不然就是不对成
        return stack.empty();
    }

image.png

这里的代码太冗余了,我们可以使用哈希表简化一下。

public boolean isValid(String s) {
        if(s == null || s.length() == 0 || "".equals(s)){
            return true;
        }
        Map<Character,Character> map = new HashMap(4);
        //这里右括号为 key,左括号为 value,因为当遇到右括号时才需要处理
        map.put('}','{');
        map.put(')','(');
        map.put(']','[');
        Stack<Character> stack = new Stack();
        stack.push(s.charAt(0));
        Character p = null;
        for(int i = 1;i<s.length();i++){
            Character item = s.charAt(i);
            if(map.containsKey(item) ){
                if(stack.empty() || map.get(item)!=stack.peek()){
                    //当栈为空,说明多出一个右括号;当对应的左括号和栈的顶部不相等,说明不对称
                    return false;
                }
                stack.pop();
            }else {
                stack.push(item);
            }
        }
        return stack.empty();
    }

image.png

执行时间都差不多。

最后

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。