5.3有效的括号(LC20-E)

news2024/11/24 3:48:10

算法:

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

比如: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)

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

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

相关文章

个人服务器到期,项目下线,新的开始

告别旧服务器 2023.11.06服务器到期,所有项目正式下线 时间真的过的很快,从开始踏入编程的大门,到现在不知不觉已经陆续经手了两台服务器了,目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿,该服务器上目前运行的项…

Docker与微服务实战——基础篇

Docker与微服务实战——基础篇 第一章 Docker 简介1.1 docker 理念1.2 容器与虚拟机比较 第二章 Docker 安装2.1 前提说明2.2 Docker的基本组成2.2.1 镜像(image)2.2.2 容器(container)2.2.3 仓库(repository&#xff…

[MICROSAR Adaptive] --- Hello Adaptive World

Automotive E/E Architecture and AUTOSAR Adaptive Platform Vector Solution: MICROSAR Adaptive First project: Hello Adaptive World Summary 1 引言 1.1 AP诞生的历史背景 新一代电子电器架构通常将车内的节点分为三类。计算平台,预控制器和传感器执行器相关的节点,…

深度学习框架TensorFlow.NET之数据类型及张量2(C#)

环境搭建参考: 深度学习框架TensorFlow.NET环境搭建1(C#)-CSDN博客 由于本文作者水平有限,如有写得不对的地方,往指出 声明变量:tf.Variable 声明常量:tf.constant 下面通过代码的方式进行学…

用python写一个爆破网站管理员密码脚本

文章目录 拉取环境寻找登录界面寻找参数编写脚本试验效果 拉取环境 靶场环境是docker环境,把docker靶场映射到本机的7777端口,以便访问 docker pull docker.io/zksmile/vul docker run -d -p 7777:80 --name shop zksmile/vul:secshop_v2首页&#xff…

【嵌入式开发工具】TI+IAR建立工程与在线调试

IAR于1983 年在瑞典乌普萨拉由工程师Anders Rundgren创立,“IAR”是 Ingenjrsfirman Anders Rundgren 的缩写,意思是Anders Rundgren工程公司。笔者接触到这个开发工具主要是因为其对早期Ti的芯片支持很好,开发起来比较方便。不过现在TI公司官…

嵌入式中如何将BootLoader与APP合并成一个固件

1、前言 嵌入式固件一般分为BootLoader和App,BootLoader用于启动校验、App升级、App版本回滚等功能,BootLoader在cpu上电第一阶段中运行,之后跳转至App地址执行应用程序。 因此,在发布固件的时候,会存在BootLoader固件…

Redis02-持久化策略

目录 RDB(Redis DataBase Backup file) RDB执行原理 AOF(Append-Only File) RDB和AOF对比 Redis支持多种持久化方式,以确保数据在内存中持久存储,以便在Redis服务器重启时数据不会丢失。Redis中持久化的…

高效实用:批量重命名文件夹,提升工作效率

在日常生活和工作中,我们经常需要处理大量的文件夹,而文件夹的命名则直接关系到我们的管理效率和查找效率。如何快速、准确地批量重命名文件夹,提升工作效率呢?本文将提供一些实用的方法和技巧。现在一起来看看云炫文件管理器是如…

【Java 进阶篇】Java Cookie共享:让数据穿越不同应用的时空隧道

在Web开发中,Cookie是一种常见的会话管理技术,用于存储和传递用户相关的信息。通常,每个Web应用都会在用户的浏览器中设置自己的Cookie,以便在用户与应用之间保持状态。然而,有时我们需要在不同的应用之间共享Cookie数…

2.2整式的加减(第1课时)——合并同类项教学及作业设计

【学习目标】 1.理解同类项的概念,并能正确辨别同类项. 2.理解合并同类项的依据是乘法分配律,掌握合并同类项的方法. 知识点归纳: ★合并同类项后,所得的项的系数是___________…

Solidity数据类型之函数类型

solidity中函数的形式 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]每个关键字的意思&#xff08;方括号里面的写不写都可以&#xff09; function&#xff1a; 声明函…

基础知识:位运算

基础知识&#xff1a;位运算 1. 两类表达式 1. 两类表达式

【网安AIGC专题11.1】论文12:理解和解释代码,GPT-3大型语言模型学生创建的代码解释比较+错误代码的解释(是否可以发现并改正)

Comparing Code Explanations Created by Students and Large Language Models 写在最前面总结思考 背景介绍编程教育—代码理解和解释技能培养编程教育—解决方案研究问题研究结果 相关工作Code ComprehensionPedagogical Benifis of code explanationLarge Language Models i…

【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成

文章目录 一、监控有哪些指标二、prometheus、grafana架构Prometheus 组件Grafana 组件架构优点 三、安装prometheus和node-exporter1. docker pull镜像2. 启动node-exporter3. 启动prometheus 四、promql基本语法五、grafana的安装和使用1. 新建空文件夹grafana-storage&#…

二维空间与三维空间的姿态表示法

二维空间与三维空间的姿态表示法 一、2D空间姿态表示法二、3D空间姿态表示法2.1 三个数表示空间姿态问题 2.2 九个数表示空间姿态问题 2.3 四个数表示空间姿态 结语Reference 假设&#xff0c;你有志成为我空军某航空旅歼-20飞行员&#xff0c;但要想开好飞机&#xff0c;那就得…

mac装不了python3.7.6

今天发现一个很奇怪的问题 但是我一换成 conda create -n DCA python3.8.12就是成功的 这个就很奇怪

数据结构——B树

文章目录 B树1. 概念2. B树插入分析3.插入过程4. B树插入实现5.B树验证6. B树性能分析7.B树&B*树8. 小结9. B树的运用MyISAMInnoDB 10. 总结 B树 可以用于查询的数据结构非常的多&#xff0c;比如说二插搜索树、平衡树、哈希表、位图、布隆过滤器&#xff0c;但如果需要存…

【MySQL】MySQL入门基础

文章目录 一、数据库基础1. 什么是数据库2. 数据库和文件3. 主流数据库&#xff08;关系型数据库&#xff09; 二、MySQL的基本使用1. 连接服务器2. 服务器管理3. 服务器、数据库、表关系4. 使用案例 三、数据的逻辑存储和实际存储四、MySQL的架构五、SQL分类六、存储引擎 一、…

Java基础-015-System.java常用类

Java基础-015-System.java常用类 1、标准输入输出2、获取属性3、System.java初始化4、设置标准输出System.out java/lang/System.java 1、标准输入输出 System.in、System.out public class Test {public static void main(String[] args) {String charsetName String.valueOf…