思路

按照题目的要求,正确的输入一定是会正确关闭的。可知这个序列有几个特点:

  1. 长度是偶数,是奇数一定是错的;
  2. 左括号和右括号是一致的;
  3. 一定会有一对括号是写在一起的。

比如这样的就是不对的:[(]),因为没有一对是在一起的。

首先需要将字符串变成一个字符数组,遍历之。遵循下述的原则:

  1. 遇到左括号,将对应的右括号压栈;
  2. 遇到右括号,则弹栈,栈顶元素如果和该右括号不相等或者栈根本就是空,则返回false,这个字符串不合法;
  3. 当数组遍历完成之后,这个栈应该是空的,否则就返回false。

代码

private boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        char[] chars = s.toCharArray();
        for (char aChar : chars) {
            if (aChar == '(') {
                stack.push(')');
            } else if (aChar == '[') {
                stack.push(']');
            } else if (aChar == '{') {
                stack.push('}');
            } else if (stack.isEmpty() || stack.pop() != aChar) {
                return false;
            }
        }
        return stack.isEmpty();
    }