20. Valid Parentheses

解法一

思路

最直接的想法是利用栈。
遍历字符串,对于左括号入栈。
如果遇到右括号,将最近入栈的字符出栈,如果不匹配,返回 false;
如果数组遍历完了,栈也为空,未出现不匹配就返回 true;
其中会遇到几个情况需要解决,比如空字符串返回 true;比如要保证 pop() 时栈内得有元素等

代码
class Solution {
    public boolean isValid(String s) {
        if (s.length() == 0 || s == null) return true;
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(' || s.charAt(i) == '{' || s.charAt(i) == '{') {
                // 入栈
                stack.push(s.charAt(i));
            } else {
                if (stack.size() != 0) {
                    char c = stack.pop();
                    if (c == '{' && s.charAt(i) != '}') return false;
                    else if (c == '[' && s.charAt(i) != ']') return false;
                    else if (c == '(' && s.charAt(i) != ')') return false;
                } else {
                    return false; // In this case the there is no left parentheses in stack, but there still is a right one at i
                }
            }
        }
        if (stack.isEmpty()) {
            return true; // All pairs are formed.
        }
        return false;
    }
}
复杂度分析
  • 时间复杂度
    O(n)
  • 空间复杂度
    O(n)

解法二

思路

此题还有一个更为聪明的做法,使代码更加简洁。我们知道,如果要匹配,出现一个左括号必须再出现一个右括号。那么我们可以在出现左括号时入栈相应的右括号。由于栈后进先出,如果配对,在遇到左括号后出现的一定是对应的右括号。这时,我们仅需将刚刚入栈在栈顶的右括号取出判断是否是对应的右括号即可。
另外,所有括号必须成对。如果最后栈非空,那一定是有未成对的括号出现,返回 false。

代码
class Solution {
    public boolean isValid(String s) {
        if (s.length() == 0 || s == null) {
            return true;
        }
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.push(')');
            } else if (s.charAt(i) == '{') {
                stack.push('}');
            } else if (s.charAt(i) == '[') {
                stack.push(']');
            } else if (stack.isEmpty() || stack.pop() != s.charAt(i)) {
                return false;
            }
        }
        return stack.isEmpty();
    }
}
复杂度分析
  • 时间复杂度
    O(n)
  • 空间复杂度
    O(n)
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!