LeetCode:20. 有效的括号

问题链接

#### 20. 有效的括号

问题描述

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

有效字符串需满足:

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

提示:

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

示例

示例1
输入:s = "()"
输出:true

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

示例3
输入:s = "(]"
输出:false

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

解题思路

核心:栈

  • 方法1: 替换字符串
    不停的用()、[]、{}对原字符串进行替换,替换成空字符串;直到无法替换,看一下当前字符串是不是空,不如是空,返回true;反之,存在多余的括号,返回false。

  • 方法2: 栈
    首先,检验一下字符串的长度是不是2的整数倍,如果不是,肯定有括号无法进行匹配,直接结束;
    然后,新建一个栈,遍历原字符串:如果遇到左括号,就往栈里扔;如果遇到右括号,取出栈顶元素进行匹配校验,校验失败就直接返回false结束;
    最后,校验一下栈是否为空,如果为空,表示全都匹配完了,返回true;反之,返回false。

代码示例(JAVA)

这里仅展示栈的解法,其中,用了一个map来维护括号对。

class Solution {
    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {
            return false;
        }

        Stack<Character> stack = new Stack<>();
        Map<Character, Character> map = new HashMap<Character, Character>() {{
            put(')', '(');
            put('}', '{');
            put(']', '[');
        }};
        for (char c : s.toCharArray()) {
            if (!map.keySet().contains(c)) {
                stack.push(c);
            } else {
                if (stack.empty() || stack.pop() != map.get(c)) {
                    return false;
                }
            }
        }
        return stack.empty();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容