20. 有效的括号[简单]

168 阅读1分钟

问题

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

思路

  • 需要使用 栈 这个数据结构。
  • 匹配时,可以用上map。
  • 最基本的长度判断优化。
  • 只有当最后栈是空的才是匹配的。

public static boolean isValid(String s) {
    int n = s.length();
    if (n % 2 == 1) {
        return false;
    }

    Map<Character, Character> map = new HashMap<>();
    map.put(')', '(');
    map.put(']', '[');
    map.put('}', '{');
    Stack<Character> stack = new Stack<>();
    for (int i = 0; i < n; i++) {
        char temp = s.charAt(i);
        if (!map.containsKey(temp)) {
            stack.push(temp);
        } else {
            if (stack.isEmpty() || stack.pop() != map.get(temp)) {
                return false;
            }
        }
    }
    return stack.isEmpty();
}

需要注意的是,上面使用的是 Character 。leet-code代码执行耗时1ms,优过97%的提交代码。

如果Map和Stack中使用String的话,会很慢。耗时是4ms,仅有过9%。可以对比试试。


public boolean isValid(String s) {
    int n = s.length();
    if (n % 2 == 1) {
        return false;
    }

    Map<String, String> map = new HashMap<>();
    map.put(")", "(");
    map.put("]", "[");
    map.put("}", "{");
    Stack<String> stack = new Stack<>();
    for (int i = 0; i < n; i++) {
        String temp = s.charAt(i) + "";
        if (!map.containsKey(temp)) {
            stack.push(temp);
        } else {
            if (stack.isEmpty() || !stack.pop().equals(map.get(temp))) {
                return false;
            }
        }
    }
    return stack.isEmpty();
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

硬广告

欢迎关注公众号:double6