括号问题专项

259 阅读1分钟

有效的括号

题目

image.png

版本1 正确

    public boolean isValid(String s) {

        // 判断括号是否有效
        // 利用一个栈, 遇见左括号就添加, 遇见右括号就弹出栈顶的元素判断是否相等
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i ++) {
            char temp = s.charAt(i);
            if (temp == '(' || temp == '[' || temp == '{') {
                stack.push(temp);
            } else {
                // 需要考虑栈为空的情况
                if (stack.size() == 0) {
                    return Boolean.FALSE;
                }
                char beforeLeft = stack.pop();
                if (beforeLeft != findLeft(temp)) {
                    return Boolean.FALSE;
                }
            }
        }

        return stack.size() == 0;
    }

    // 根据右括号, 返回需要的左括号
    public char findLeft(char right) {
        if (right == ')') {
            return '(';
        }else if (right == '}') {
            return '{';
        } else {
            return '[';
        }
    }

正确的原因

(1) 需要考虑栈为空的情况, 然后直接遇见右边括号

(2) 最后判断为true的时候, 栈里面不应该有元素