20.有效的括号

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

一共有3种括号。每种括号可分为左括号和右括号。我们可以模拟一个匹配的过程,没有右括号都应和一个左括号匹配上。可以依次遍历这些括号,遇到左括号时,我们不知道是否有右括号和它匹配,所以应该把它暂存起来。遇到右括号时,这时前面必须有一个正确的左括号和它匹配。

对于第一个遇到的右括号,和它匹配的一定是之前最后遇到的一个左括号,如果该左括号不匹配或不存在,说明匹配失败。

如果能匹配成功,我们消去这一对括号。继续判断下一个括号的情况。再遇到右括号,继续找之前的最后一个左括号(注意这里已经去掉了匹配成功的括号,所以还是满足和最后一个左括号匹配的条件)。

用一个stack存储左括号。

代码

class Solution {
    private static Map map = new HashMap();
    static {
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
    }
    public boolean isValid(String s) {
        LinkedList stack = new LinkedList();
        int length = s.length();
        for(int i = 0; i < length; i++) {
           char c = s.charAt(i);
           if(map.containsKey(c)) {
               char c1 = stack.isEmpty()? '#' : stack.pop();
               if(!map.get(c).equals(c1)) {
                   return false;
               }
           } else {
               stack.push(c);
           }
        }

        return stack.isEmpty();
    }
}

知识点

1.LinkedList可以作为栈使用。可以直接调用它的push和pop方法。

你可能感兴趣的:(20.有效的括号)