首页 > 其他分享 >LeetCode 20. 有效的括号

LeetCode 20. 有效的括号

时间:2022-08-27 13:44:22浏览次数:79  
标签:ch 20 stack 括号 哈希 字符串 false LeetCode

题目

题目链接:https://leetcode.cn/problems/valid-parentheses/

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

题解

判断括号的有效性可以使用「栈」这一数据结构来解决。

我们遍历给定的字符串 ss。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。

当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss 无效,返回$ \text{False}$。为了快速判断括号的类型,我们可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。

在遍历结束后,如果栈中没有左括号,说明我们将字符串 ss 中的所有左括号闭合,返回 $ \text{True}$,否则返回 $ \text{False}$。

注意到有效字符串的长度一定为偶数,因此如果字符串的长度为奇数,我们可以直接返回$ \text{False} $,省去后续的遍历判断过程。

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

        Map<Character, Character> pairs = new HashMap<Character, Character>(){{
            //为了快速判断括号的类型(即为判断右括号是否与左括号是一类)建立哈希表 用来存储每一种括号
            //哈希表的键——右括号    哈希表的值——左括号
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};//至此 哈希表建立完成
        Deque<Character> stack = new LinkedList<Character>();//建立栈 用于存放左括号
        for(int i = 0; i < n; i++){
            char ch = s.charAt(i);//取出字符串中的字符ch
            if(pairs.containsKey(ch)){//判断Map集合对象中是否包含指定的键名
                if(stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                    return false;
                    //1.栈为空 说明右括号在左括号前面 false
                    //2.栈顶元素(实际的左括号)如果不等于当前ch(右括号 键) 对应的值(理论上正确的左括号)  false
                }
                stack.pop();//如果上面的都符合了 说明找到了匹配的左右括号 栈中的左括号可以出栈了!
            }
            else{
                stack.push(ch);
            }
        }
        return stack.isEmpty();//如果栈是空的(返回true) 那么说明所有括号的是匹配(有效)的
    }

拓展

    public boolean isValid(String s) {
        while(true){
            int l=s.length();
            s=s.replace("()","");
            s=s.replace("{}","");
            s=s.replace("[]","");
            if(s.length()==l){return l==0;}
        }
    }

标签:ch,20,stack,括号,哈希,字符串,false,LeetCode
From: https://www.cnblogs.com/ciel717/p/16630423.html

相关文章

  • git--2022年8月26日
    第一节 git概述 第二节 git安装1、下载地址:https://git-scm.com/downloads2、下载好后傻瓜式安装3、打开gitbash,设置用户签名git......
  • leetcode143-重排链表
    重排链表快慢指针+翻转链表通过快慢指针找到中间节点,然后将后半段进行翻转,然后与前半段进行拼接。classSolution{publicvoidreorderList(ListNodehead){......
  • CF1720C 题解
    前言题目传送门!更好的阅读体验?赛时锁题后看别人代码,怎么都和我想法不一样?幸好没有被hack。思路以下把L字形的覆盖网格,直接称为L。贪心思考,我们想让每次L覆盖......
  • CF1720D1 题解
    前言题目传送门!更好的阅读体验?有点思维难度的DP优化题。小知识在做这道题之前,你需要知道:\(x-y,y-x\lex\oplusy\lex+y\)。证明非常简单,利用异或的性......
  • 数据库学习笔记 (本数据库学习笔记以SQL sever 2019 为例进行学习) 20220823 第一节课
    教材及参考数据库课程讲什么?内容安排第一部分数据库原理部分第一章数据库系统概述为什么要学习数据库?数据库的发展改变了人们的工作和生活模式信息积累与运用......
  • CCF 202109-2 非零段划分(C++)差分法
    借用岛屿情况来分析这个题。考虑p足够大的情况,所有的数都被海水淹没了,只有0个岛屿。然后,海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;每当一个凹......
  • VS2019修改文件编码
    1.查看文件编码安装扩展,FileEncoding,就可以在文件窗口右下角查看到该文件的编码方式,同时也可以直接在此处修改。2.修改项目的文件编码使用editorconfig文件。在工具......
  • 2022-8-27 每日一题-层序遍历+标记+剑指offer-字典树+dfs
    662.二叉树最大宽度难度中等409收藏分享切换为英文接收动态反馈给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度......
  • 20220827研讨会2
    NLP  image eventgraph                                   ......
  • day 20 前面知识内容回顾
    内容回顾一阶段(页面布局和样式)html+css(布局和修饰)html5新增css3新增移动端适配(大屏适配)rem(媒体查询)(seo搜索引擎优化)动画效果css3二阶段(js基础以及底层实现)js基础......