(动画详解)LeetCode20.有效的括号

题目描述

20. 有效的括号 - 力扣(LeetCode)

解题思路

栈的方法

遍历整个字符串

当检测到左括号的时候,就让左括号入栈

当检测到右括号的时候,就让左括号出栈与右括号对比

如果相等则继续比较直到结束,如果不相等就直接返回false

当匹配到右括号但栈中已经没有相应的左括号与之对应时就说明右括号多于左括号,那么饭返回false

当遍历结束后如果发现栈中还有元素,那么说明左括号多于右括号,返回fasle

分析完之后,我们决定定义一个栈来完成这道题,下面是需要的函数

StackInit,用于初始化栈

StackDestroy,用于释放内存,其他语言不用考虑,这里用C语言来实现

StackPush,用于向栈顶推入数据

StackPop,用于弹出栈顶数据

StackTop,用于返回栈顶元素

动画详解

先以'('和')'为例进行演示,这是最简单的一种情况

接着我们来看一个比较复杂的场景

示例( ( [ [ ] ] ) )  

那么下面我们来分析失败的情况

示例  (  )  (  ]

下面我们来看看括号个数不一致的情况

第一种情况是左括号多于右括号

示例  (  (  (  )  )

 

接下来就是右括号多于左括号的情况了

示例  (  (  )  )  )

 

代码实现

// 创建栈
typedef char STDataType;struct Stack
{STDataType* x;int top;int capacity;
};typedef struct Stack ST;void StackInit(ST* pst)
{assert(pst);pst->x = NULL;pst->capacity = 0;// top指向的是栈顶元素的下一个位置pst->top = 0;// top指向的是当前的栈的元素/*pst->top = -1;*/
}void StackDestroy(ST* pst)
{assert(pst);free(pst->x);pst->x = NULL;pst->capacity = pst->top = 0;
}// 获取栈顶元素
STDataType StackTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->x[pst->top-1];
}void StackPush(ST* pst, STDataType x)
{assert(pst);// 扩容// top和capacity相等时说明没有容量了if (pst->top == pst->capacity){// 判断容量是否为空int newcapacity = pst->capacity==0 ? 4 : pst->capacity * 2;STDataType* new = (STDataType*)realloc(pst->x,newcapacity * sizeof(STDataType));if (new == NULL){perror("realloc failed");return;}pst->x = new;pst->capacity = newcapacity;}pst->x[pst->top] = x;pst->top++;
}// 出栈
void StackPop(ST* pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}// 判断栈是否为空
bool StackEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}bool isValid(char* s)
{ST st;StackInit(&st);// 遍历字符串,如果是左括号就入栈while(*s){if((*s=='(')||(*s=='[')||(*s=='{')){StackPush(&st,*s);}// 如果是右括号,那么就让左括号出栈,并且比较二者是否匹配else{// 判断栈是否为空,也就是右括号多于左括号if(StackEmpty(&st)){StackDestroy(&st);return false;}char top = StackTop(&st);StackPop(&st);//如果不匹配,那么就直接返回fasleif((top=='('&&*s!=')')||(top=='['&&*s!=']')||(top=='{'&&*s!='}')){return false;}}s++;}bool ret = StackEmpty(&st);return ret;StackDestroy(&st);return 0;
}

复杂度分析

我们很容易发现,关于栈的几个函数时间复杂度都近似为O(1),而仅有isValid函数中存在while循环,所以这个代码的时间复杂度为O(n)

总结

Bye!!

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

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

相关文章

【C++历练之路】STL中的哈希——手搓哈希底层逻辑

W...Y的主页 💕 代码仓库分享 😊 前言: "hash"通常指的是哈希,它是一种将数据(如字符串或者数字)转换为一个固定长度的数值(通常是整数)的方法。哈希函数能够将任意长度…

《人工智能Ⅰ》课程复习资料(下)

本文是对我的大学课程——《人工智能Ⅰ》的课程知识整理,分上下两个部分,本文为下半部分,上半部分详见《人工智能Ⅰ》课程复习资料(上) 内容为速记精简版,若想进一步了解学习请参考更多资料。 目录 回归…

【工具推荐定制开发】一款轻量的批量web请求命令行工具支持全平台:hey,基本安装、配置、使用

背景 在开发 Web 应用的过程中,作为开发人员,为了确认接口的性能能够达到要求,我们往往需要一个接口压测工具,帮助我们快速地对我们所提供的 Web 服务发起批量请求。在接口联调的过程中,我们通常会用 Postman 等图形化…

Springboot 单体thymeleaf极简门户网站

企业门户网站,基于Springboot和layui 1、原介绍 使用技术:后端框架:SpringBoot,Mybatisplus ### 数据库:MySQL,redis ## 前端框架:Layui ## 权限框架:shiro ## 网页模板引擎:thyme…

嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

随着物联网和智能设备的快速发展,嵌入式开发和鸿蒙系统成为了当前技术领域的热门话题。鸿蒙系统作为华为推出的全场景分布式操作系统,旨在连接各种智能设备,提供无缝的跨设备体验。而南向开发则是鸿蒙系统中的一个重要方向,主要涉…

水面垃圾清理机器人的视觉算法研究

卷积神经网络是一种分层的数据表示模型,通常由数据输入层、卷积层、池化层、 非线性激活函数、全连接层以及输出结果预测层等组成,其中卷积层、池化层和非线 性激活函数是卷积神经网络中的重要组成部分。此外,有些模型会增加其他的层(归一 化…

白话机器3:PCA与SVM详细数学原理

一、PCA数学原理 1.数据标准化 首先,需要对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。假设有一个的数据矩阵X,其中每一列是一个样本,每一行是一个特征。 标准化公式如下: 其中,…

TCP四次挥手中为什么 TIME_WAIT 等待的时间是 2MSL?

TCP 连接断开 1、TCP 四次挥手过程是怎样的?如下图 2、为什么 TIME_WAIT 等待的时间是 2MSL? MSL 是 Maximum Segment Lifetime,报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因…

CMakeLists.txt语法规则:改变行为的变量说明一

一. 简介 前面一篇文章学习了 CMakeLists.txt语法中的 部分常量变量,具体学习提供信息的变量,文章如下: CMakeLists.txt语法规则:提供信息的变量说明一-CSDN博客 CMakeLists.txt语法规则:提供信息的变量说明二-CSD…

文件加密软件排行榜前四名|好用的四款文件加密软件分享

在数据泄露事件频发的今天,文件加密软件成为了保护个人隐私与企业信息安全的必备工具。 选择一款高效、可靠且易用的加密软件至关重要。 本文精选了当前市场上备受好评的十款文件加密软件,旨在为您在数据保护之旅中提供方向。 1.域智盾 域智盾软件是一…

[报错解决]Communications link failure

报错 主机IDEA项目连接虚拟机的数据库报错。 主要报错信息有: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received a…

论文阅读】 ICCV-2021-3D Local Convolutional Neural Networks for Gait Recognition

motivation :现有方法方法无法准确定位身体部位,不同的身体部位可以出现在同一个条纹(如手臂和躯干),一个部分可以出现在不同帧(如手)的不同条纹上。其次,不同的身体部位具有不同的尺度,即使是不同帧中的同一部分也可以出现在不同…

O2O:Uni-O4

ICLR 2024 paper Intro 以往O2O方式普遍将离线与在线过程分开看待,为了避免过渡时容易出现performance drop,引入了各式正则化或者保守价值估计。本文启发于BPPO,提出on-policy的算法Uni-O4将离线与在线阶段的策略优化目标统一,…

制造业为什么需要质量管理系统

质量管理是一个企业最重要的核心竞争力之一。为了确保产品和服务的高质量,企业需要建立一个完善的质量管理体系。而质量管理系统(QMS)正是指导企业如何规范、组织和管理质量相关活动的框架和流程。 在智能制造时代,广大企业如何结…

react状态管理之state

第三章 - 状态管理 随着你的应用不断变大,更有意识的去关注应用状态如何组织,以及数据如何在组件之间流动会对你很有帮助。冗余或重复的状态往往是缺陷的根源。在本节中,你将学习如何组织好状态,如何保持状态更新逻辑的可维护性&…

《编译原理》阅读笔记:p1-p3

《编译原理》学习第 1 天,p1-p3总结,总计 3 页。 一、技术总结 1.compiler(编译器) p1, But, before a program can be run, it first must be translated into a form in which it can be executed by a computer. The software systems that do thi…

2023年谷歌拒了228万应用,禁了33.3万账号,开发者们应如何应对2024的挑战?

谷歌在上周一公布了去年如何应对恶意应用和恶意行为。 报告指出,去年谷歌在Google Play平台上,通过不断升级安全系统、更新政策规定、运用先进的机器学习技术,以及严格把关应用审核流程,成功阻止了高达228万个不合规的应用程序上架…

力扣41. 缺失的第一个正数

Problem: 41. 缺失的第一个正数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.将nums看作为一个哈希表,每次我们将数字n移动到nums[n - 1]的位置(例如数字1应该存在nums[0]处…),则在实际的代码操作中应该判断nums[i]与nums[nums[i] - 1]是否相等,若…

【管理咨询宝藏96】企业数字化转型的中台战略培训方案

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏96】企业数字化转型的中台战略培训方案 【格式】PDF版本 【关键词】SRM采购、制造型企业转型、数字化转型 【核心观点】 - 数字化转型是指&…

Web3 ETF软件开发

开发Web3 ETF软件涉及到金融、法律和技术等多个领域的专业知识,因此存在以下技术难点,开发Web3 ETF软件是一项复杂的技术挑战,需要综合考虑各种因素。开发人员需要具备较强的技术能力和跨学科知识才能成功开发Web3 ETF软件。北京木奇移动技术…