20. 有效的括号 题解

news2024/11/25 0:29:20

题目描述:20. 有效的括号 - 力扣(LeetCode)

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

有效字符串需满足:

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

 解题思路:

当解决有效的括号问题时,我们需要使用一种数据结构来检查括号的闭合顺序。栈(Stack)是一个非常适合这个问题的数据结构,因为它遵循"后进先出"(Last In First Out,LIFO)的原则,与括号的嵌套结构相符。

  1. 首先,我们创建一个空栈,用于存储括号字符。

  2. 遍历输入的字符串 s 中的每个字符:

    • 如果字符是开括号('(', '{', '['),将其推入栈中。
    • 如果字符是闭括号(')', '}', ']'),我们需要检查栈是否为空
      • 如果栈为空,表示没有对应的开括号与之匹配,返回 False。
      • 如果栈不为空,则从栈顶弹出一个元素,并与当前字符对应的开括号进行匹配。如果不匹配,返回 False。
  3. 当遍历完所有字符后,检查栈是否为空

    • 如果栈为空,表示所有的括号都已经正确闭合,返回 True。
    • 如果栈不为空,表示还有未闭合的括号,返回 False。

注:

  • 如果字符是闭括号(')', '}', ']'),我们为什么需要检查栈是否为空

如果不检查栈为空时,遇到右括号直接进行从栈顶弹出一个元素,会造成越界访问。

同时,也要注意在返回之前一定要free开辟的空间,否则会造成内存泄漏:

其对应的情况可能是:

①遇到第一个括号是右括号,此时栈为空,没有进行开辟空间,直接返回不会造成内存泄漏;

②如果情况是:'(', '{', '}',')', ']'-->当遇到右括号‘]’时,栈中没有元素,栈为空,但是栈所用的空间没有free,此时如果没有free直接返回,就会造成内存泄漏。(就相当于,你买一瓶矿泉水,你把水喝完后,瓶子还在)

  • 当遍历完所有字符后,为什么要检查栈是否为空?

要应对的情况是:

①'[', '(', '{', '}',')'     当右括号 '}',')' 都匹配完后,栈中还剩下'[',则说明'['没有右括号与其匹配;

②全是左括号的情况。

代码:

bool isValid(char * s)
{
    Stack stack;
		StackInit(&stack);
    while(*s)
    {
        // 如果是左括号,就入栈
        if(*s=='(' || *s=='{' || *s=='[')
        {
            StackPush(&stack, *s);
            s++;
        }
        else // 如果是右括号,就出栈匹配
        {
					        // 遇到右括号时,但是栈为空,说明没有左括号与其匹配
			if(StackEmpty(&stack))
			{
				StackDestroy(&stack);
				return false;
			}
            STDataType temp =  StackTop(&stack);
						StackPop(&stack);
            if((*s==')' && temp!='(') || 
                (*s==']' && temp!='[') || 
                (*s=='}' && temp!='{'))
            {
                StackDestroy(&stack);
                return false;
            }
			else
			{
				s++;
			}
        }
    }
		// 如果栈中不是空,说明栈中还有左括号,有左括号没有匹配(全是左括号)
	bool ret  = StackEmpty(&stack);
    StackDestroy(&stack);
    return ret;
}

这种算法的时间复杂度是 O(n),其中 n 是输入字符串的长度,因为我们需要遍历一次输入字符串。空间复杂度是 O(n),因为最坏情况下,栈中可能需要存储所有的字符。


本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用于全局复根和极点查找算法的自适应网格生成器(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

JS 将 json 对象转成字符串并保留格式 - JSON.stringify()

JSON.stringify(value, replacer, space) value:将要序列化成一个 JSON 字符串的值。 replacer(可选):如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理&#xf…

Prometheus的搭建与使用

一、安装Prometheus 官网下载地址:Download | Prometheus 解压:tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名: mv prometheus-2.19.2.linux-amd64 /home/prometheus进入对应目录: cd /home/prometheus查看配置文件&am…

item_get_desc-获得TB商品描述

一、接口参数说明: item_get_desc-获得淘宝商品描述,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_desc 名称类型必须描述keyString是调用key(点…

安全加密框架图——Oracle安全开发者

Oracle安全开发者 ACLs 设计 ACLs(访问控制列表)时,可以根据以下思路进行设计: 所有者文件权限:确定文件的所有者能够对文件执行哪些操作,如读取、写入、执行等。这可以根据文件的性质和拥有者的职责来决…

Cygwin 配置C/C++编译环境以及如何编译项目

文章目录 一、安装C、C编译环境需要的包1. 选择gcc-core、gcc-g2. 选择gdb3. 选择mingw64下的gcc-core、gcc-g4. 选择make5. 选择cmake6. 确认更改7. 查看包安装状态 二、C、C 项目编译示例step1:解压缩sed-4.9.tar.gzstep2:执行./configure生成Makefile…

Nginx网站服务(安装nginx、平滑升级nginx、nginx各种访问配置)

一、Nginx概述 1、什么是nginx? 稳定性高、系统资源消耗低、对HTTP并发连接的处理能力高(单台物理器可支持30000-50000个并发请求) NG并发连接能力有2个因素的影响 ①CPU的个数 ②本地吴立琪系统的最大文件打开数2、Nginx应用场景 静态服…

日常BUG——普通页面跳转tabbar页面报错

😜作 者:是江迪呀✒️本文关键词:日常BUG、BUG、问题分析☀️每日 一言 :存在错误说明你在进步! 一、问题描述 微信小程序页面跳转的时候出现下面的问题: wx.redirectTo({url: /pages/index/i…

行业分析(思维逻辑)

1、 如何着手分析一个行业? - 知乎做行业分析,很容易陷入一个误区,就是认为:我只要能找到最全的、最准的信息,就能做好行研。所以很多知…https://www.zhihu.com/question/20219092/answer/666346625 2、 3、 4、 …

Linux下搭建java环境

文章目录 一,xshell链接linux二,linux安装jdk环境 一,xshell链接linux 这里用到的工具,VMware搭配CentOS7 64位Xshell5 操作之前确保,传输Xshell连接了虚拟机 打开Xshell,文件->新建 主机ip—>进入虚拟机,右键打开终端,输入命令:ifco…

统筹型人才PK执行型人才,有啥区别?

统筹型人才PK执行型人才,有啥区别? 在大企业成长序列中 在着力培养统筹型人才 趣讲大白话:将还是兵? 【趣讲信息科技257期】 **************************** 我有华为公司当员工的同事 当干到一定年龄和职位后 有个判定&#xff1a…

手把手教你更改Vue项目图标

引言: Vue.js 是一款轻量级的前端框架,具有灵活、高效和易用等特点。在开发Vue项目时,我们经常会使用第三方库或工具来为项目添加图标,以提升用户界面的美观度。在本文中,将向大家介绍如何手把手更改Vue项目的图标&am…

R语言实现计算净重新分类指数(NRI)和综合判别改善指数(IDI)

两个模型比较,与第一个模型相比,NRI(重新分对的 - 重新分错的)/总人数。IDI(新模型患者平均预测概率-旧模型患者平均预测概率)-(新模型非患者平均预测概率-旧模型非患者平均预测概率&#xff09…

【Unity每日一记】关于物体(敌方)检测—(向量点乘相关)

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

【游戏开发教程】Unity Cinemachine快速上手,详细案例讲解(虚拟相机系统 | 新发出品 | 良心教程)

文章目录 一、前言二、插件下载三、案例1:第三人称自由视角,Free Look character场景1、场景演示2、组件参数2.1、CinemachineBrain:核心2.2、CinemachineFreeLook:第三人称自由视角相机2.2.1、设置Follow:跟随2.2.2、…

“Linux vs. Windows: 一些你可能不知道的区别“

文章目录 每日一句正能量前言分享一些在Linux上顺理成章,换到Windows上就可能令人费解的事介绍或分享一些Linux的使用技巧介绍或分享一些Windows的使用技巧后记 每日一句正能量 世界上最暖心的一句话,不是你在成功时多热切地喝彩,而是在失意时…

大疆秋招指南,网申测评和面试攻略

大疆秋招内容简介 这是一个非常卷的时代,一到毕业季,各种各样规模不一的公司,纷纷向社会招聘,竞争实力强,知名度越高的企业,往往越能得到能力出众的人才的青睐,也正是在一批批新血液的注入下&a…

使用插件实现pdf,word预览功能

效果 代码&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

运营商三要素 API:构建安全高效的身份验证系统

当今数字化的世界中&#xff0c;身份验证是各行各业中至关重要的一环。为了保护用户的隐私和数据安全&#xff0c;企业需要寻求一种既安全可靠又高效便捷的身份验证方式。运营商三要素 API 应运而生&#xff0c;为构建安全高效的身份验证系统提供了有力的解决方案。 运营商三要…

【Apple】Logic Pro导入7.1.4.wav并自动分析多声道

Step1: 创建空项目 Step2: 选中下图“使用麦克风或...”这一项&#xff0c;底下要创建的轨道数填1就行。 点击创建之后&#xff1a; Step3: 拖动文件、拖动文件、拖动文件到项目中&#xff0c;并选中复选框“所有所选文件都源自一个项目&#xff08;将创建一个智能速度多轨道集…