C++力扣题目20--有效的括号

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = "(]"
输出:falses思路:

由于栈结构的特殊性,非常适合做对称匹配类的题目。

首先要弄清楚,字符串里的括号不匹配有几种情况。

一些同学,在面试中看到这种题目上来就开始写代码,然后就越写越乱。

建议在写代码之前要分析好有哪几种不匹配的情况,如果不在动手之前分析好,写出的代码也会有很多问题。

先来分析一下 这里有三种不匹配的情况,

  1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。 

    括号匹配1

  2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 

    括号匹配2

  3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。 

    括号匹配3

我们的代码只要覆盖了这三种不匹配的情况,就不会出问题,可以看出 动手之前分析好题目的重要性。

动画如下:

20.有效括号

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false

第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false

那么什么时候说明左括号和右括号全都匹配了呢,就是字符串遍历完之后,栈是空的,就说明全都匹配了。

分析完之后,代码其实就比较好写了,

但还有一些技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!

实现C++代码如下:

class Solution {
public:bool isValid(string s) {stack<char>sta;if (s.size() % 2 != 0) { return false; }//如果s的长度为奇数,一定不匹配for (int i = 0; i < s.size(); i++){                                               if (s[i] == '(') { //如果是左括号,转换一下插入右括号sta.push(')');      //方便后面插入右括号进行相等比较进行抵消continue; }if (s[i] == '[') { sta.push(']'); continue;}if (s[i] == '{') { sta.push('}'); continue;}if (sta.empty()||sta.top() !=s[i]) { return false; }//出现第三种情况,右括号多余if (sta.top() == s[i]) { //如果插入的括号与栈顶括号匹配就出栈sta.pop();}}return sta.empty();}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kantts个性化自动化训练

官网的都是手动训练&#xff0c;我做了一个自动化训练&#xff0c;执行一下&#xff0c;然后全部就能训练完。 说明: audio是存放原始音频的位置&#xff0c;auto_train_main是核心自动化代码。 auto_train_main代码: # -*- coding: utf-8 -*- import string import random …

又一款 AI 工具火爆全网!DomoAI 实测体验如何(二)

上一篇介绍了 DomoAI 的两种生成视频的方式&#xff1a; 1、根据上传的视频生成多种风格的视频 2、根据上传的图片生成视频 下图就是通过 DomoAI 生成的一组视频。 DomoAI测试视频 对制作过程感兴趣的可以看上一篇&#xff1a; 程序员X小鹿&#xff1a;【AI 视频】又一款 AI…

众和策略:突然,科创板在审最大IPO终止

2月22日晚&#xff0c;传来科创板在审最大IPO蜂巢动力中止的音讯。 蜂巢动力主营新动力轿车动力电池及储能电池系统的研制、出产和出售。陈说期内&#xff08;2019年至2021年&#xff0c;及2022年上半年&#xff09;公司业绩继续大额赔本&#xff0c;归母净获利分别为-3.26亿元…

干货分享 | TSMaster报文发送的信号生成器操作说明

信号生成器功能是TSMaster分析中的报文发送模块。信号生成器用于发送和配置每个 CAN/LIN信号的值变化行为(简而言之&#xff0c;这是一个可以控制和调整CAN/LIN信号值的功能)。而我们可选择的信号生成器类型有8种&#xff0c;今天重点和大家分享一下关于TSMaster信号生成器的8种…

【数据结构】——期末复习题题库(1)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

基于SpringBoot实现的高仿网盘

一、系统架构 前端&#xff1a;html | bootstrap | js | css 后端&#xff1a;SpringBoot | mybatis 环境&#xff1a;JDK1.8 | Mysql | Maven 二、代码及数据库 三、功能介绍 01. 登录 02. 主页 03. 新建文件夹 04. 上传文件 05. 分享文件 06. 提取分享文件 07. 分享文…

智慧交通应用钡铼技术无线工业边缘路由网关R10A

智慧交通应用中&#xff0c;无线工业边缘路由网关扮演着至关重要的角色。在这方面&#xff0c;钡铼技术无线工业边缘路由网关R10A被广泛应用于交通管理系统中&#xff0c;它具备一路RS485、一路WAN、一路LAN、4G和WiFi等功能。本文将详细介绍R10A的参数以及在智慧交通领域的应用…

系列八(实战)、发送 接收延迟消息(Java操作RocketMQ)

一、发送 & 接收延迟消息 1.1、概述 延迟消息是指发送者发送完消息后&#xff0c;不希望消息被立即投送给订阅者&#xff0c;等一段时间之后再投递给订阅者&#xff0c;例如生活中我们常见的例子&#xff0c;京东商城购物、12306买火车票...&#xff0c;下完订单后就可以发…

搭建本地的pip镜像源

1. 创建文件夹&#xff1a;./pypi_mirror_test 2. 创建并进入conda虚拟环境&#xff0c;安装pip2pi包 pip install pip2pi 3. 下载pypi的packages 可以参考其他博客&#xff0c;或者我之前的博客. 偷懒&#xff0c;仅仅测试用的话&#xff1a; 1&#xff09;在文件夹下创…

系列十一(实战)、发送 接收带标签的消息(Java操作RocketMQ)

一、发送 & 接收带标签的消息 1.1、概述 消息的种类纷繁复杂&#xff0c;不同的业务场景需要不同的消息&#xff0c;基于此RocketMQ提供了消息过滤功能&#xff0c;通过Tag或者Key进行区分&#xff0c;本章介绍Tag&#xff0c;我们再往一个Topic里面发送消息的时候&#x…

【浏览器】同源策略和跨域

1. 什么是跨域 在说跨域之前,先说说同源策略,什么是同源策略呢?同源策略是浏览器的一种安全机制,减少跨站点脚本攻击(XSS,Cross Site Scripting)、跨站点请求伪造(CSRF,Cross Site Request Forgery)攻击等,因为非同源的请求会被浏览器拦截掉。 同源就是协议、域名(…

doris基本操作,04-表结构的变更

整体思路 因为doris完全兼容mysql协议&#xff0c;因此操作上基本与mysql没有太大区别&#xff0c; 之需要注意与doris相关的关键字即可&#xff0c;如&#xff1a;预聚合&#xff0c;key等 当前表结构 create table table1 {siteid int default 10,citycode smallint,usern…