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

LeetCode - 20.有效的括号

作者: 安小辰 | 来源:发表于2019-02-27 13:19 被阅读0次

题目

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

示例 1:

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

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

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

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

输入: "{[]}"
输出: true

解答:

   class Solution {
    /**
     * 判断是否包含有效的括号。
     * @param s
     * @return
     */
    public boolean isValid(String s) {
        //空字符串算有效。
        if (s.equals("")) {
            return true;
        }
        //用两个集合分别来装左右括号。
        List<Character> left = new ArrayList<>();
        List<Character> right = new ArrayList<>();
        left.add('(');
        left.add('[');
        left.add('{');
        right.add(')');
        right.add(']');
        right.add('}');

        //把字符串转换为字符数组。
        char[] chars = s.toCharArray();

        //用栈来操作字符数组,遇到左括号进栈,遇到右括号把对应的左括号出栈;
        Stack<Character> stack = new Stack();
        for (char a : chars) {
            //把左括号进栈。
            if (left.contains(a)) {
                stack.push(a);
                continue;
            }
            //其它非括号的字符不操作。
            if (!right.contains(a)) {
                continue;
            }
            //此时代表当前字符是右括号。
            //栈为空代表有多余的右括号。
            if (stack.isEmpty()) {
                return false;
            }
            char c = stack.pop();
            int index = right.indexOf(a);
            //如果栈顶不是对应的左括号,则代表括号顺序异常。
            if (c != left.get(index)) {
                return false;
            }
        }
        //如果栈不为空,那么代表有多余的左括号。
        return stack.isEmpty();
    }
}

相关文章

网友评论

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

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