LeetCode【20、有效的括号】(简单)

345 阅读1分钟

题目描述

这是 LeetCode 上的 20. 有效的括号,难度为 简单

关键字: 哈希表

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

有效字符串需满足:

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

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

提示:

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

解题思路

判断括号的有效性:我们一般使用 栈(先进后出) 这个数据结构来解决问题。

遍历字符的时候,我们可以先把 左括号 ( [ { 压入栈内,是 右括号 ) ] } 的时候,与栈顶元素进行比较是否匹配,匹配成功左括号出栈,否则右括号入栈。如果是字符串是有效括号,最终栈是空的,因此我们直接判断栈到最后是否为空即可。

class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 == 1) {
            // 如果是奇数,直接返回不符合
            return false;
        }

        // 建立一个哈希表,存储括号的值,注意匹配和奇偶
        HashMap<Character, Character> map = new HashMap(3);
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');

        // 初始化一个栈对象
        Stack stack = new Stack();
        // 遍历字符串
        char[] cs = s.toCharArray();
        for (char c : cs) {
            if (map.containsKey(c)) {
                // 如果是右括号
                if (stack.isEmpty() || stack.peek() != map.get(c)) {
                    // 如果是空的 或者 右括号没有匹配左括号,则失败
                    return false;
                } else {
                    stack.pop();
                }
            } else {
                // 如果是左括号直接入栈
                stack.push(c);
            }
        }
        // 如果最后栈空了,说明完美匹配,及成功
        return stack.isEmpty();
    }
}

引用

我的 github 仓库已经同步建立,点击访问