LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号

news2025/5/10 20:06:02

LeetCode详解系列的总目录(持续更新中):

LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客

LeetCode详解系列的上一题链接:

LeetCode详解之如何一步步优化到最佳解法:14. 最长公共前缀_leetcode 14-CSDN博客

目录

LeetCode详解系列的总目录(持续更新中):

LeetCode详解系列的上一题链接:

20. 有效的括号

解法1:暴力解法

解法1思路:

代码:

解法性能:

优化思路:

解法2:最终版

代码:

解法性能:


20. 有效的括号

本题题目链接:20. 有效的括号 - 力扣(LeetCode)

解法1:暴力解法

解法1思路:

从题目中,我们看出来,总共有3对括号,这种mapping关系我们可以用字典来存储,方便我们用O(1)的复杂度来查询。并且,对于每一个左括号,一方面,不一定有对应的右括号与之配对;另一方面,即使有这样的右括号,很大概率这个右括号不是字符串中的下一个字符。因此,我们需要有一个地方来存储还没有配对的括号,我们可以使用一个列表来存储这些信息。接着,我们开始遍历输入的字符串。

对于每一个字符,假如当前列表为空的话,我们需要判断这个字符对应的括号是左括号,还是右括号,因为输入的字符串有效的条件之一为“每个右括号都有一个对应的相同类型的左括号”,那么,如果当前的括号是右括号的话,我们就可以直接判断字符串不是有效的(因为列表为空,前面没有与之配对的左括号);如果当前的括号是左括号,我们就将其存储到列表中。

如果当前列表不为空的话,若当前的括号为右括号,我们需要判断列表中最后一个括号是不是和这个右括号是配对的,如果是的话,则配对成功,移除列表中最后一个括号;否则,输入的字符串不是有效的(因为当前的这个右括号没有与之配对的左括号,题目中指出字符串有效的条件之一为“左括号必须以正确的顺序闭合”)。若当前括号为左括号,则将这个括号存到列表中。

等遍历完字符串后,假如列表是非空的,说明还有没配对的括号,输入的字符串不是有效的;否则,输入的字符串是有效的。具体的代码如下所示:

代码:

class Solution:
    def isValid(self, s: str) -> bool:
        store = []
        mapping = {
            ")": "(",
            "}": "{",
            "]": "["
        }
        for kuohao in s:
            if not store:
                if kuohao == ")" or kuohao == "}" or kuohao == "]":
                    return False

                store.append(kuohao)
            else:
                if kuohao in mapping.keys():
                    if store[-1] != mapping[kuohao]:
                        return False
                    else:
                        store.pop()
                else:
                    store.append(kuohao)
        
        if store:
            return False
        else:
            return True

解法性能:

优化思路:

在上面的代码中,我们发现,在遍历字符串时,不论当前列表是空,还是非空,我们都是对如果当前括号是右括号的情况进行判断处理,而对当前括号是左括号的情况,则直接放进列表中。那么,我们是不是可以将操作进行合并,先处理右括号和左括号的情况。如果是右括号的话,再处理列表是空,还是非空的情况。优化后的代码如下所示:

解法2:最终版

代码:

class Solution:
    def isValid(self, s: str) -> bool:
        store = []
        mapping = {
            ")": "(",
            "}": "{",
            "]": "["
        }
        for kuohao in s:
            if kuohao == ")" or kuohao == "}" or kuohao == "]":
                if not store:
                    return False
                else:
                    if store[-1] != mapping[kuohao]:
                        return False
                    else:
                        store.pop()
            else:
                store.append(kuohao)
        
        if store:
            return False
        else:
            return True

解法性能:

 

解法分析:

对比“解法2”和“解法1”的代码,我们可以发现,优化后的代码更加紧凑,逻辑更加清晰。代码紧凑,可以减少内存的消耗,因此,优化了这个指标。

 

 

 

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

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

相关文章

Mydumper备份数据库

介绍: MyDumper是一个MySQL逻辑备份工具。它有2个工具: mydumper负责导出 MySQL 数据库的一致备份myloader从 mydumper 读取备份,连接到目标数据库并导入备份。 这两个工具都使用多线程功能。 下载链接: https://github.com/m…

BN测试和训练时有什么不同, 在测试时怎么使用?

我们来彻底搞懂 Batch Normalization(BN) 在训练和测试阶段的区别,以及 测试时怎么用。 🧠 一句话总结: 训练时:使用 当前 mini-batch 的均值和方差 测试时:使用 整个训练集估计的“滑动平均均值…

JavaWeb 课堂笔记 —— 02 JavaScript

本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…

多GPU训练

写在前面 限于财力不足,本机上只有一个 GPU 可供使用,因此这部分的代码只能够稍作了解,能够使用的 GPU 也只有一个。 多 GPU 的数据并行:有几张卡,对一个小批量数据,有几张卡就分成几块,每个 …

如何在 Linux 上安装 Python

本指南介绍如何在Linux机器上安装 Python。Python 已成为开发人员、数据科学家和系统管理员必不可少的编程语言。它用于各种应用,包括 Web 开发、数据科学、自动化和机器学习。 本综合指南将引导您完成在 Linux 系统上安装Python的过程,涵盖从基本包管理…

系统与网络安全------Windows系统安全(6)

资料整理于网络资料、书本资料、AI,仅供个人学习参考。 共享文件夹 发布共享文件夹 Windows共享概述 微软公司推出的网络文件/打印机服务系统 可以将一台主机的资源发布给其他主机共有 共享访问的优点 方便、快捷相比光盘 U盘不易受文件大小限制 可以实现访问…

复古千禧Y2风格霓虹发光酸性镀铬金属短片音乐视频文字标题动画AE/PR模板

踏入时光机,重温 21 世纪初大胆、未来主义和超光彩的美学!这是一个动态的 After Effects 模板,旨在重现千禧年的标志性视觉效果——铬反射、霓虹灯发光、闪亮的金属和流畅的动态图形。无论您是在制作时尚宣传片、怀旧音乐视频还是时尚的社交媒…

如何设计一个本地缓存

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 如何设计一个本地缓存 随着系统的复杂性和数据量的增加,如何快速响应用户请求、减…

SpringBoot洗衣店订单管理系统设计与实现

一个基于SpringBoot的洗衣店订单管理系统的设计与实现。 系统概述 支持管理员管理顾客与店家信息、店家管理店铺与洗衣信息,以及顾客预约、查看洗衣信息与交流等功能。 部分功能模块 1. 管理员模块 ​顾客信息管理 ​店家信息管理 2. 店家模块 ​店铺信息管 …

模版的特性及其编译分离

1.模版的分类 模版参数分为 类型形参 和 非类型形参 类型形参:出现在模版参数列表中,跟在class和typename之后的参数类型名称 非类型形参:就是用一个常量作为类(函数)模版的一个参数,在类(函…

NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)

区间问题是另⼀种⽐较经典的贪⼼问题。题⽬⾯对的对象是⼀个⼀个的区间,让我们在每个区间上做出取舍。 这种题⽬的解决⽅式⼀般就是按照区间的左端点或者是右端点排序,然后在排序之后的区间上,根据题⽬要求,制定出相应的贪⼼策略&…

搭建redis主从同步实现读写分离(原理剖析)

搭建redis主从同步实现读写分离(原理剖析) 文章目录 搭建redis主从同步实现读写分离(原理剖析)前言一、搭建主从同步二、同步原理 前言 为什么要学习redis主从同步,实现读写分析。因为单机的redis虽然是基于内存,单机并发已经能支撑很高。但是随着业务量…

Rust切片、结构体、枚举

文章目录 切片类型字符串切片其他结构的切片 结构体结构体实例元组结构体结构体所有权输出结构体结构体的方法结构体关联函数单元结构体 枚举match语法Option枚举类if let 语句 切片类型 切片(Slice)是对数据值的部分“引用” 我们可以从一个数据集合中…

【学习笔记】深度学习环境部署相关

文章目录 [AI硬件科普] 内存/显存带宽,从 NVIDIA 到苹果 M4[工具使用] tmux 会话管理及会话持久性[A100 02] GPU 服务器压力测试,gpu burn,cpu burn,cuda samples[A100 01] A100 服务器开箱,超微平台,gpu、…

股票日数据使用_未复权日数据生成前复权日周月季年数据

目录 前置: 准备 代码:数据库交互部分 代码:生成前复权 日、周、月、季、年数据 前置: 1 未复权日数据获取,请查看 https://blog.csdn.net/m0_37967652/article/details/146435589 数据库使用PostgreSQL。更新日…

【LeetCode Solutions】LeetCode 146 ~ 150 题解

CONTENTS LeetCode 146. LRU 缓存(中等)LeetCode 147. 对链表进行插入排序(中等)LeetCode 148. 排序链表(中等)LeetCode 149. 直线上最多的点数(困难)LeetCode 150. 逆波兰表达式求值…

《 如何更高效地学习》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:个人谈心 🌍文章目入 一、明确学习目标二、制定学习计划三、选择合适的学习方法(一)主动学习(二)分散学习(三&#…

分布式数据一致性场景与方案处理分析|得物技术

一、引言 在经典的CAP理论中一致性是指分布式或多副本系统中数据在任一时刻均保持逻辑与物理状态的统一,这是确保业务逻辑正确性和系统可靠性的核心要素。在单体应用单一数据库中可以直接通过本地事务(ACID)保证数据的强一致性。 然而随着微服务架构的普及和业务场…

JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南

1、简述 Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。 在分布式系统中&#…

Linux中的调试器gdb与冯·诺伊曼体系

一、Linux中的调试器:gdb 1.1安装与版本查看 可以使用yum进行安装: yum install -y gdb 版本查看:使用指令 gdb --version 1.2调试的先决条件:release版本与debug版本的切换 debug版本:含有调试信息 release版本…