算法力扣刷题 二十九【20. 有效的括号】

前言

栈和队列篇,继续。
记录 二十九【20. 有效的括号】


一、题目阅读

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

二、尝试实现

思路

题目意思是看括号有没有成功配对,并且配对顺序由内层到外层合理。
(1)首先,如果string长度是奇数,肯定是false。
(2)双指针法试试:行不通。

示例一:s = " {,[,(,),],} ",从两端指或者从一半的地方指;
对于示例二:s = "()[]{}",不成立,所以pass。

(3)只能从头遍历string s.

  • 如果遇到左括号,压入栈里;
  • 如果遇到右括号,取一个栈顶元素,看是否配对?用栈可以满足大括号套中括号套小括号,嵌套时候的顺序配对正确。

代码实现

class Solution {
public:
    bool isValid(string s) {
        if(s.size()%2 != 0){ //奇数,肯定不配对。
            return false;
        }
        stack<char> stack1;
        for(int i = 0;i < s.size();i++){
            if(s[i] == '(' || s[i] == '[' || s[i] == '{'){
                stack1.push(s[i]);
            }else if(s[i] == ')'){
                if(!stack1.empty() && stack1.top() == '('){ //补充添加stack1不为空,如果有括号先出现,访问了空栈。
                    stack1.pop();
                }else{
                    return false;
                }
            }else if(s[i] == ']'){
                if(!stack1.empty() && stack1.top() == '['){
                    stack1.pop();
                }else{
                    return false;
                }
                
            }else if(s[i] == '}'){
                if(!stack1.empty() && stack1.top() == '{'){
                    stack1.pop();
                }else{
                    return false;
                }
            }
        }

        if(stack1.empty()){ //整个for循环结束,成功配对,stack1中不应该有元素。
            return true;
        }else{
            return false;
        }
        

    }
};

两处细节修正:

  • 如果s只有左括号,也是不配对的;for循环判断不出,所以最后加if(stack1.empty())。成功配对后,stack1中肯定是空。
  • 如果一上来就是右括号,只是if(stack1.top() == ‘{’),出现 访问空栈;所以需要加if(!stack1.empty() && stack1.top() == ‘(’) ,是否为空的判断。

三、参考思路

参考思路链接

学习内容

  • 栈在对称匹配类题目中作用很大
  • 先分析了三种不匹配的情况: 左括号多余;右括号多余;括号类型不匹配;
  • 技巧:如果是s[i]左括号,不是把左括号本身放到栈里,而是把其对应的右括号放到栈里。当s[i]是右括号时:只需要看当前栈顶元素是不是相等。
    • 如果栈为空:说明右括号多余;
    • 如果栈顶不相等:说明嵌套的顺序不对;
    • 如果遍历结束,栈不为空:说明左括号多余。
    • 总结:这个思路一开始就把所有情况都囊括,无需在实现之后查漏补缺。
  • 对比思路下来:发现把右括号放进去,代码更简练,而不是拿着右括号去找左括号。

代码实现

class Solution {
public:
    bool isValid(string s) {
        if(s.size()%2 != 0){ //奇数,肯定不配对。
            return false;
        }
        stack<char> stack1;
        for(int i = 0;i < s.size();i++){
            if(s[i] == '(')
                stack1.push(')');
            else if(s[i] == '[')
                stack1.push(']');
            else if(s[i] == '{')
                stack1.push('}');
            else if(stack1.empty() || stack1.top() != s[i]){
                return false;
            }
            else stack1.pop();//注意:这里还得有else
        }
         
        return stack1.empty();	

    }
};

有几处写的很好:

  • 这样for循环return false是一条语句。
  • 最后不是if判断空,而是直接return stack1.empty();

总结

  • 栈用来解决对称匹配问题。
  • 把匹配方(右括号)放进去,而不是把自己(左括号)放进去。拿着匹配方(右括号)去找相不相等。

(欢迎指正,转载标明出处)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线&#xff1a; 通过这条路线可以清楚看到&#xff0c;我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL&#xff08;复位脉冲控制器&#xff09;给NRST&#xff08;硬件复…

Vue组件如何“传话”?这里有个小秘诀!

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-组件通信 目录 Vue组件通信 &#xff08;1&#xff09; props / $emit 1. 父组件向子组件传…

线段树知识总结

线段树这个东西&#xff0c;这次是第二次学习&#xff0c;怎么说呢&#xff0c;感觉理解还是不是特别的透彻&#xff0c;因此&#xff0c;在后面彻底完学习之后这个东西再改成公开 线段树概念引入 线段树是一种数据结构&#xff0c;其并不算是一种算法&#xff0c;而是一种减…

8.12 矢量图层面要素单一符号使用十五(栅格线渲染边界)

前言 本章介绍矢量图层线要素单一符号中标记符号渲染边界&#xff08;Outline: Marker line&#xff09;的使用说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 栅格线渲染边界&#xff08;Outline: Raster Line&#xff09; Outline系列只画边界&#xf…

【代码随想录】【算法训练营】【第58天】 [卡码101]孤岛的总面积 [卡码102]沉没孤岛 [卡码103]水流问题 [卡码104]建造最大岛屿

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 58&#xff0c;周四&#xff0c;ding~ 题目详情 [卡码101] 孤岛的总面积 题目描述 卡码101 孤岛的总面积 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 […

mac外接显示屏,切换程序坞和启动台在哪个屏幕显示,最实用教程

程序坞和启动项是同步的 首先&#xff0c;程序坞和展开启动项是同步出现在同一个屏幕的&#xff0c;所以只需要把程序坞“呼唤”到指定的显示器就行。 无需设置&#xff0c;动对了鼠标就行 无所谓哪个是主屏&#xff0c;设置中都没有切换程序坞位置的选项&#xff0c; 想要…

vue单独部署到宝塔教程

配置反向代理 注意:如果目标网站是https则写https否则写http 2.关于解决部署后无法刷新,直接报错404 location / { try_files $uri $uri/ /index.html; }

代码随想录算法训练营第四十三天| 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、 123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 题目链接&#xff1a;121. 买卖股票的最佳时机 文档讲解&#xff1a;代码随想录 状态&#xff1a;做出来了 贪心思路&#xff1a; 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取最左最小值&#xff0c;取最右最大值&#xff0c;那么得到的…

新建Vue工程的几种方法

文章目录 vue-clivue/clivue3Viteparcel vue-cli vue-cli是针对构建vue的脚手架CLI2&#xff0c;只能新建vue2工程。 全局安装vue-cli之后&#xff0c;构建vue2项目的格式为&#xff1a; vue init 构建方式 project_name&#xff1a;比如以下5种构建方式 vue init webpack pr…

UNIAPP_顶部导航栏右侧添加uni-icons图标,并绑定点击事件,自定义导航栏右侧图标

效果 1、导入插件 uni-icons插件&#xff1a;https://ext.dcloud.net.cn/plugin?nameuni-icons 复制 uniicons.ttf 文件到 static/fonts/ 下 仅需要那个uniicons.ttf文件&#xff0c;不引入插件、单独把那个文件下载到本地也是可以的 2、配置页面 "app-plus":…

PID算法介绍以及代码实现过程说明

写在正文之前 在上一篇文章就说会在这两天会基于PID写一个文章&#xff0c;这里的原理部分值得大家都看一下&#xff0c;代码部分的实现是基于python的&#xff0c;但是对于使用其他编程语言的朋友&#xff0c;由于我写的很通俗易懂&#xff0c;所以也值得借鉴。 一、PID算法…

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff1a;Java运行时环境开发工具&#xff1a;javac&#xff08;编译工具&#xff09;、java&#xff08;运行…

偏微分方程笔记(驻定与非驻定问题)

椭圆方程可以看成抛物方程 t → ∞ t\rightarrow\infty t→∞的情况。 抛物&#xff1a; 双曲&#xff1a;

学习aurora64/66b.20240703

简介 The AMD LogiCORE™IP Aurora 64B/66B core是一种可扩展的轻量级高数据速率链路层协议&#xff0c;用于高速串行通信。该协议是开放的&#xff0c;可以使用AMD设备技术实现。 Aurora 64B/66B是一种轻量级的串行通信协议&#xff0c;适用于多千兆位链路 (如下图所示)。它…

微信小程序禁止PC端打开防止白嫖广告或抓接口

前言 晓杰每日靠着微薄的小程序广告度日&#xff0c;继之前检测手机端微信跳过小程序广告插件检测后又发现小程序广告在电脑端经常没广告&#xff0c;导致收入备降&#xff01;虽然每天只有几块钱的收入&#xff0c;哈哈哈&#xff01;那么怎么做到禁止小程序使用电脑端微信打…

nginx的匹配及重定向

一、nginx的匹配&#xff1a; nginx中location的优先级和匹配方式&#xff1a; 1.精确匹配&#xff1a;location / 对字符串进行完全匹配&#xff0c;必须完全符合 2.正则匹配&#xff1a;location ^~ ^~ 前缀匹配&#xff0c;以什么为开头 ~区分大小写的匹配 ~* 不区分…

Unity | Shader基础知识(第十七集:学习Stencil并做出透视效果)

目录 一、前言 二、了解unity预制的材质 三、什么是Stencil 四、UGUI如何使用Stencil&#xff08;无代码&#xff09; 1.Canvas中Image使用Stencil制作透视效果 2.学习Stencil 3.分析透视效果的需求 五、模型如何使用Stencil 1.shader准备 2.渲染顺序 3.Stencil代码语…

【TypeScript】TS入门到实战(详解:高级类型)

目录 第三章、TypeScript的数据类型 3.1 TypeScript的高级类型 3.1.1 class 3.1.1.1 熟悉class类 3.1.1.2 class类继承的两种方式 3.1.1.3 class类的5种修饰符 3.1.2 类型兼容 3.1.3 交叉类型 3.1.4 泛型 3.1.4.1 创建泛型函数 3.1.4.2 泛型函数的调用 3.1.4.3 泛型…

c++纵横字谜

1.实现一个纵横字谜 2.支持14x14的网格 3.可以查看答案 4.猜测错误会提示答案信息 5.从txt读取词汇 6.每次游戏开始 随机生成纵横字谜 n’h

Jest是什么软件?

Jest是一个由Facebook开发的开源JavaScript测试框架&#xff0c;它专为JavaScript项目的测试而设计&#xff0c;特别适用于React和Node.js环境。Jest以其简单的配置、高效的性能和易用性而闻名&#xff0c;成为现代JavaScript项目中不可或缺的测试工具。以下是关于Jest的详细解…