5.3有效的括号(LC20-E)

算法:

题目中:左括号必须以正确的顺序闭合。意思是,最后出现的左括号(对应着栈中的最后一个元素),应该先找到对应的闭合符号(右括号)

比如:s="( [ ) ]"就是False,因为"("比"["先出现,对应地,"( [ "中最后的元素应该最先找到闭合符"]",而 闭合符(就是右括号)先出现的是")",这个时候就能判断False了

括号匹配是使用栈解决的经典问题。

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

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

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

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

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

怎么用栈来解决该问题?

举个例子:s="(","[","}",")"

遍历字符串中的符号,发现左括号时,往栈中push其对应的右符号;发现右括号时,往栈中pop与其一样的右括号

当遍历到"(",push“)”  //stack=")"

当遍历到"[",push"]"  //stack="]" , ")"

当遍历到"}",push“}”  //stack=“}”, "]" , ")"

当遍历到")", pop ")"  //stack=“}”, "]" 

发现stack非空,说明括号无效。

总的代码思路如下(遍历s中的符号item):

1.如果 `item` 是一个开放符号(‘(’, ‘[’, ‘{’),则将相应的闭合符号压入栈中。

2.如果 `item` 是一个闭合符号(‘)’, ‘]’, ‘}’),则检查栈是否为空,或者栈顶元素(最后一个元素)与 `item` 不相等。

  • 栈为空:说明没有右括号了,肯定不对了
  • 栈顶元素(最后一个元素)与 `item` 不相等:说明最近的需要的闭合符号不对(和示例一样)
  • 如果以上任一条件为真,则意味着闭合符号不平衡,函数返回 `False`

3.如果 `item` 是一个闭合符号,并且它与栈顶元素匹配,那么从栈中弹出顶部元素,表示开放符号和闭合符号是平衡匹配的。

4.在遍历完 `s` 中的所有字符后,如果栈为空,则表示所有的开放符号都已经匹配并弹出,函数返回 `True`。否则,如果栈不为空,则表示存在未匹配的开放符号,函数返回 `False`

调试过程:

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for item in s:
            #如果s的长度为奇数,必然不符合,可以做个简单判断剪枝,节省时间
            if len(s)%2 != 0:
                return False
            elif item == "(":
                stack.append(")")
            elif item == "[":
                stack.append("]")
            elif item == "{":
                stack.append("}")
            #如果输入的不是以上三种左括号,那只能是右括号了
            #如果是右括号,正确的s对应的stack中应该存在该右括号了(刚刚append了)
            #如果此时stack为空,或者栈顶非距离最近的左括号的闭合符号,那就False
            elif not stack or item != stack[-1]:
            #注意:应该先判非空再判item != stack[-1],因为若stack为空,stack[-1]不存在,判断时就会报错
                return False
            else:
                stack.pop()
        return True if stack == None else False

原因:最后返回语句写得不对。栈为空应该用“stack == []”或者“len(stack)==0”表示。

在Python中,`None` 表示一个空对象,而 `[]` 表示一个空列表。在这段代码中,我们使用一个列表来模拟栈的数据结构。当栈为空时,我们希望栈对象 `stack` 的值是一个空列表 `[]`

当使用 `stack == None` 进行判断时,它会检查栈对象 `stack` 是否是 `None`,而不是一个空列表。因此,如果栈为空,但是栈对象 `stack` 的值是 `None`,那么判断结果就会是错误的。

正确代码:

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        for item in s:
            #如果s的长度为奇数,必然不符合,可以做个简单判断剪枝,节省时间
            if len(s)%2 != 0:
                return False
            elif item == "(":
                stack.append(")")
            elif item == "[":
                stack.append("]")
            elif item == "{":
                stack.append("}")
            #如果输入的不是以上三种左括号,那只能是右括号了
            #如果是右括号,正确的s对应的stack中应该存在该右括号了(刚刚append了)
            #如果此时stack为空,或者栈顶非距离最近的左括号的闭合符号,那就False
            elif not stack or item != stack[-1]:
            #注意:应该先判非空再判item != stack[-1],因为若stack为空,stack[-1]不存在,判断时就会报错
                return False
            else:
                stack.pop()
        return True if stack == [] else False

时间空间复杂度:

  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

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

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

相关文章

【错误解决方案】ModuleNotFoundError: No module named ‘my_fake_useragent‘

1. 错误提示 ModuleNotFoundError: No module named my_fake_useragent,这意味着你试图导入一个名为 my_fake_useragent 的模块,但Python找不到这个模块。 2. 解决方案 检查模块名是否正确: 确保你试图导入的模块名是正确的。也许你拼写错误或者大小写不…

【Midjourney入门教程1】Midjourney的注册、订阅

文章目录 前言一、Midjourney是什么二、Midjourney注册三、新建自己的服务器四、开通订阅 前言 AI绘画即指人工智能绘画,是一种计算机生成绘画的方式。是AIGC应用领域内的一大分支。 AI绘画主要分为两个部分,一个是对图像的分析与判断,即“…

onnx 模型加载部署运行方式

1.通过文件路径的onnx模型加载方式: 在onnxruntime下面的主要函数:session Ort::Session(env, w_modelPath.c_str(), sessionOptions); 这里的文件路径是宽字节的,通过onnx文件路径直接加载模型。 在opencv下使用dnn加载onnx模型的主要函数: std::string model…

Redo Log(重做日志)的刷盘策略

1. 概述 Redo Log(重做日志)是 InnoDB 存储引擎中的一种关键组件,用于保障数据库事务的持久性和崩溃恢复。InnoDB 将事务所做的更改先记录到重做日志,之后再将其应用到磁盘上的数据页。 刷盘策略(Flush Policy&#x…

css基础之实现轮播图

原理介绍 图片轮播的原理是通过控制显示和隐藏不同的图片来实现图像的切换,从而创建连续播放的效果。用到的知识点有定位和定时器。 实现步骤: HTML 结构: 首先,需要在HTML中创建一个包含轮播图片的容器,通常使用 &l…

Golang源码分析之golang/sync之singleflight

1.1. 项目介绍 golang/sync库拓展了官方自带的sync库,提供了errgroup、semaphore、singleflight及syncmap四个包,本次分析singlefliht的源代码。 singlefliht用于解决单机协程并发调用下的重复调用问题,常与缓存一起使用,避免缓存…

要做一名成功的测试,首先得会想?

近在做测试时,突然想到了这么个问题——在测试的过程中对某个功能想得越开,测试就完整,就越彻底! 当然我们在产生与该功能相关的想象时,其中最关键的是不能脱离需求,不能脱离该软件本身;不然这…

WebSocket Day02 : 握手连接

前言 握手连接是WebSocket建立通信的第一步,通过客户端和服务器之间的一系列握手操作,确保了双方都支持WebSocket协议,并达成一致的通信参数。握手连接的过程包括客户端发起握手请求、服务器响应握手请求以及双方完成握手连接。完成握手连接后…

优雅的 Dockerfile 是怎样炼成的?

Docker 简介 目前,Docker 主要有两个形态:Docker Desktop 和 Docker Engine。 Docker Desktop 是专门针对个人使用而设计的,支持 Mac(已支持arm架构的M系芯片) 和 Windows 快速安装,具有直观的图形界面&a…

【教3妹学编程-算法题】117. 填充每个节点的下一个右侧节点指针 II

2哥 : 3妹,听说你昨天去面试了,怎么样啊? 3妹:嗨,别提了,让我回去等通知,估计是没有通知了, 还浪费我请了一天假。 2哥 : 你又请假了啊, 你是怎么跟你那个严厉的老板请假…

微服务架构之路1,服务如何拆分?使用微服务的注意事项?

目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分?1、拆分原则2、拆分时机和拆分方法3、拆分实践 五、使用微服务的注意事项1、确保相关业务和利益相关者的支持2、确定微服务的拆分粒度3、遵循微服务架构的原则4、确保接口的稳定性5、关注数据一致性6、…

postMessage

A:端口3000 import React, { useEffect } from react;function App() {useEffect(() > {const childWindow document.getElementById(child).contentWindow;const sendMessageToChild () > {childWindow.postMessage("主页面消息", "http://localhost:…

【QT5之QFtp模块】编译及使用

下载 传送门:https://github.com/qt/qtftp 或者 git clone https://github.com/qt/qtftp.git 下载ZIP,解压待用。 编辑 使用QtCreator打开qtftp.pro; 修改如下: qtftp.pro中,将第21行注释; src/qftp.pro中,将第4行…

Java程序设计2023-第四次上机练习

8-1 三子棋 编写程序,实现简单的三子棋游戏。在三子棋中,双方在33的棋盘中轮流下棋,一方用*示,另一方用O表示。如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜。如果棋盘已被棋子占满&#x…

设置DevC++支持c++11标准

1.点击编译选项 2. 设置语言标准 3.点击确认 4.测试代码 使用auto成功 测试!

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执…

统计学习方法 条件随机场

文章目录 统计学习方法 条件随机场随机场马尔可夫随机场定义因子分解 条件随机场定义参数化形式简化形式矩阵形式 概率预测问题前向-后向算法概率的计算期望值的计算 学习问题改进的迭代尺度法拟牛顿法 解码问题 统计学习方法 条件随机场 学习李航的《统计学习方法》时&#x…

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级(方式2)前言什么是IAP?什么是BootLoader? 方案介绍:1)bootloader部分:2)APP部分…

基于单片机的胎压监测系统的设计

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案二、 系统设计4.1 主流程图 三 系统仿真5.1 系统仿真调试实物 四、 结论 概要 本文以STC89C52单片机为控制核心,通过气压传感器模块对汽车各轮胎的胎压进行实时数据的采集与处理&…

【数据结构】树与二叉树(二):树的表示C语言:树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示1.树形表示法2.嵌套集合表示法结构体创建树主函数 3.嵌套括号表示法结构体创建树嵌套括号表示法主函数 4.凹入表示法结构体创建树凹入表示法…