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

news2024/11/17 10:34:19

题目描述

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);
            //如果不匹配,那么就直接返回fasle
            if((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.coloradmin.cn/o/1664606.html

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

相关文章

农业生产中,土壤墒情的监测方法有哪些?

农业是人类的生命之源,而土壤墒情则是农业生产的基础。我们应该倍加珍惜土地资源,合理利用水资源,努力创造出更加宜人的生长环境。让每一滴水都能为农作物带来生机,让每一寸土地都能孕育丰收。这样才能实现农业可持续发展的目标&a…

leetCode刷题记录4-面试经典150题-2

文章目录 不要摆,没事干就刷题,只有好处,没有坏处,实在不行,看看竞赛题面试经典 150 题 - 2210. 课程表 II909. 蛇梯棋 不要摆,没事干就刷题,只有好处,没有坏处,实在不行…

问题:幂等性 分布式session

web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成,举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页,现在在toTrade请求中使用异步任务编排Completab…

ROS2 安装与测试

文章目录 ROS2 安装与测试ROS2 安装1. 设置编码2. 添加源3. 安装 ROS24. 设置环境变量 ROS2 示例测试实例一:命令行实例实例二:小海龟仿真实例 参考链接 ROS2 安装与测试 ROS2 安装 基于 Ubuntu 22.04 LTS 操作系统。 1. 设置编码 sudo apt update &…

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数,只是换了个名称而已。 二、方法的定义 1. 语法格式: public static 返回类型 方法名 (形参列表) { //方…

JavaScript创建日期

创建日期 在JavaScript中创建日期有四种方法 ● 使用new Date() const now new Date(); console.log(now);● 直接输入月、日、年、时间 console.log(new Date(Aug 02 2024 18:05:41));● 也可以输入年月日 console.log(new Date(December 24, 2015));● 直接按照年、月、…

力扣/leetcode383.比特位记数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 示例 代码思路 第一种方法 最简单的方法就是&#xff0c;遍历然后使用python自带的bin()方法直接…

八年三顾A股“茅庐”无果,富友支付“减利”后只能赴港上市?

都说事不过三&#xff0c;此前三次想要“进宫”&#xff0c;却三次与A股“无缘”的富友支付&#xff0c;最终无奈选择南下港交所上市了。 据港交所披露&#xff0c;上海富友支付服务股份有限公司&#xff08;简称“富友支付”&#xff09;于2024年4月30日正式向港交所递交招股…

返回分类信息(带层级)

文章目录 1.前端展示分类管理信息1.目前项目架构2.启动前后端项目1.启动mysql容器2.启动后端 renren-fast3.启动前端1.界面2.用户名密码都是admin 3.创建分类管理菜单1.菜单管理 -> 新增 -> 新增目录2.刷新3.能够新增菜单的原因是前端脚手架与renren-fast后端脚手架通信&…

3D 生成重建010-SyncDreamer从单视图生成一致性的多视图

3D 生成重建010-SyncDreamer从单视图生成一致性的多视图 文章目录 0论文工作1论文方法2 效果 0论文工作 在zero123中&#xff0c;首先探索了给2d图像扩散模型注3d空间感知能力。可以将原图输入模型&#xff0c;通过相机位置的相对偏移生成对应的新视图。 这篇论文就是在zero1…

Python大数据分析——Logistic回归模型

Logistic回归模型 概念理论分析模型评估混淆矩阵ROC曲线KS曲线 函数示例 概念 之前的回归的变量是连续的数值变量&#xff1b;而Logistics回归是二元离散值&#xff0c;用来解决二分类问题。 理论分析 上式中的hβ(X)也被称为Loqistic回归模型&#xff0c;它是将线性回归模型…

win平台c语言引入开源库的问题与解决,以引入cJSON库为例

目录 遇到的问题 开源依赖库引入的问题 问题的解决 生成dll文件 方式一 方式二 在VsCode中如何使用开源库 文件放置位置 配置文件进行配置 引入头文件 结束 许久不写博客&#xff0c;五一还在加班&#xff0c;就浅浅写一篇吧。 最近除了做物联网平台,还对网关二次开…

HCIP-Datacom-ARST必选题库_OSPF【道题】

某工程师利用2台路由器进行IPv6测试&#xff0c;他想要通过运行OSPFv3实现IPv6网络的互联互通。关于R1需要进行的OSPPv3相关配置&#xff0c;正确的有? [R1] router id 10.1.1.1A [R1-Giqabi tEthernet0/0/1] ospfv3 1 area 0 [R1-ospfv3-11 router-id 10.1.1.1 [R1-ospfv3…

Linux-线程概念

1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&#xff0c;是OS调度的基本单位&#xff1b;进程内部线程共用同一个地址空间&#xff0c;同一个页表&#xff0c;以及内存中的代码和数据&#xff0c;这些资源对于线程来说都是共享的资源 进程&#xff1a;…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

如何将手写数学公式识别?识别工具在这里

如何将手写数学公式识别&#xff1f;在日常学习中&#xff0c;将手写数学公式识别出来可以极大地提高我们的学习效率。通过这一技术&#xff0c;我们能够快速、准确地将手写公式转化为可编辑的文本&#xff0c;省去了繁琐的输入过程。这不仅节约了时间&#xff0c;还减少了因输…

【论文阅读笔记】jTrans(ISSTA 22)

个人博客地址 [ISSTA 22] jTrans&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《jTrans: Jump-Aware Transformer for Binary Code Similarity》 仓库&#xff1a;https://github.com/vul337/jTrans 提出的问题 二进制代码相似性检测&#xff08;BCSD&#xff0…

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

【数据分析】 JupyterNotebook安装及使用简介

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 在数据分析中&#xff0c;一般用Pycharm编辑代…

【软考】模拟考卷错题本2024-05-11

1 设计模式- 适配器模式 基本上上述的图解已经涵盖了绝大多数主流的设计模式和其特点。理解记忆下即可&#xff0c;这里对下午的考题也有帮助的。 2 计算机组成原理 cpu 访问速度 这个真的是憨憨咯~看到内存就选内存&#xff0c;题目都没审好。这里的速度比cpu内部的要比外部的…