美文网首页
20. 有效的括号

20. 有效的括号

作者: 软萌白甜Hedy | 来源:发表于2019-08-25 14:00 被阅读0次

    题目

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效
    有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    注意空字符串可被认为是有效字符串。
    示例 1:
    输入: "()"
    输出: true
    示例 2:
    输入: "()[]{}"
    输出: true
    示例 3:
    输入: "(]"
    输出: false
    示例 4:
    输入: "([)]"
    输出: false
    示例 5:
    输入: "{[]}"
    输出: true

    解题

    public boolean isValid(String s) {
            //先用map把括号对存起来,key:左括号;value:右括号;
            // 这样配对起来时间复杂度就为O(1);
            //防止栈为空时报错,加入('?','?')
            Map<Character,Character> map = new HashMap<Character,Character>();
            map.put('(',')');
            map.put('[',']');
            map.put('{','}');
            map.put('?','?');
            //排除几种特殊情况:
            if(s.equals("")){
                return true;
            }
            if(s.length()%2==1){
                return false;
            }
            if(s.charAt(0)==')'||s.charAt(0)==']'||s.charAt(0)=='}'){
                return false;
            }
            //初始化栈,然后循环s,如果是左括号,先入栈,并且把它放在stack的last;
            //如果有跟它配对的右括号出现,就将它移除,如果最后正好都配对完,剩下的就是最开始的那个'?'
            LinkedList<Character> stack = new LinkedList<Character>();
                stack.add('?');
            for(Character c:s.toCharArray()){
                //map如果包含key,证明就还是左括号
                if(map.containsKey(c)){
                    stack.addLast(c);
    //                map不包括key了,那证明应该是出现了一个右括号,如果符合一对括号,
    //                那它和栈里面的最后一个括号之间,肯定不能有其他形式的括号
    //                所以把栈里的最后一个从map里get出来,看是否跟右括号一样
                }else if(map.get(stack.removeLast())!=c){
                    return false;
                }
            }
            return stack.size()==1;
    }
    

    j结果

    执行用时 :5 ms, 在所有 Java 提交中击败了79.77%的用户
    内存消耗 :35.1 MB, 在所有 Java 提交中击败了82.28%的用户

    相关文章

      网友评论

          本文标题:20. 有效的括号

          本文链接:https://www.haomeiwen.com/subject/exrhectx.html