热题100 - 20. 有效的括号

28 阅读1分钟

简单

题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入: s = "()"

输出: true

示例 2:

输入: s = "()[]{}"

输出: true

示例 3:

输入: s = "(]"

输出: false

示例 4:

输入: s = "([])"

输出: true

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

思路

这道题乍一看想用双指针,但是想了想还是用栈。提到栈,前两天咱们刚好总结了现在版本的Java是用Deque全面替代Stack了,而且还总结好了Deque的一些方法。其中还分为“安全”和“危险”的方法。

快速的总结一下吧:

// 安全的:
offer() / offerLast()
poll() / pollFirst()
peek()

// 抛异常的
addFirst()
removeFirst()
getFirst()

如果想和以前的Stack操作一模一样的话,建议使用 push() / pop() / peek()的组合。

实现:

class Solution {
    public boolean isValid(String s) {
        Deque<Character> s1 = new ArrayDeque<>(); // ArrayDeque or LinkedList
        for (char c: s.toCharArray()) {
            if (c == '(' || c == '{' || c == '[') {
                s1.push(c);
            } else {
                if (s1.peek() == null) {
                    return false;
                }
            }
            if (c == '}') {
                if (s1.peek() != '{') {
                    return false;
                } else {
                    s1.pop();
                }
            } 
            if (c == ')') {
                if (s1.peek() != '(') {
                    return false;
                } else {
                    s1.pop();
                }
            } 
            if (c == ']') {
                if (s1.peek() != '[') {
                    return false;
                } else {
                    s1.pop();
                }
            } 
        }
        return s1.isEmpty();
    }
}

思路其实很简单,就是简单的栈的应用。但是我看到更优雅的写法,我给记录如下:

class Solution {
    public boolean isValid(String s) {
        Deque<Character> stack = new LinkedList<>();
        for (char c : s.toCharArray()) {
            if (c == '{') {
                stack.push('}');
            } else if (c == '[') {
                stack.push(']');
            } else if (c == '(') {
                stack.push(')');
            } else {
                if (!stack.isEmpty() && c == stack.pop()) {
                    continue;
                } else {
                    // empty stack or value not match
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}

这个更优雅的写法而且还更快。需要解释的评论区咱们讨论一下哈。