当前位置: 首页 > news >正文

括号匹配问题:栈的巧妙应用与代码优化【栈、优化、哈希表】

当解决算法问题时,灵活使用数据结构是至关重要的。在这个问题中,我们需要判断一个只包含括号的字符串是否有效,即括号是否能够正确匹配和闭合。使用这一数据结构可以很好地解决这个问题。

题目链接:有效的括号

解题思路:为什么使用栈?

括号匹配问题需要判断输入的字符串中的括号是否正确闭合,而且要求括号的顺序也必须正确。这种情况下,我们可以使用堆栈来处理。

堆栈是一种后进先出(LIFO)的数据结构,非常适合用来解决括号匹配问题。

当我们遇到左括号时,将其压入堆栈中,而遇到右括号时,我们可以弹出堆栈顶部的元素并比较是否匹配。

原始代码

首先,让我们来看一下最初的解答代码:

class Solution {
public:bool isValid(string ex) {stack<char> s;for(char c : ex){if(c == '(' || c == '[' || c == '{'){s.push(c);}else{if(s.empty()){return false;}else{if(c == ')' && s.top() == '('){s.pop();}else if(c == '}' && s.top() == '{'){s.pop();}else if(c == ']' && s.top() == '['){s.pop();}else {return false;}}}}return s.empty();}
};

优化的代码

为了简化逻辑并提高代码的可读性,我们可以使用哈希表来存储括号的对应关系,并结合栈的基本操作进行改进:

class Solution {
public:bool isValid(string s) {stack<char> st;unordered_map<char, char> mapping = {{')', '('},{']', '['},{'}', '{'}};for (char c : s) {if (c == '(' || c == '[' || c == '{') {st.push(c);} else {if (st.empty() || st.top() != mapping[c]) {return false;}st.pop();}}return st.empty();}
};

栈的基础操作的使用技巧

在解决这个问题时,我们充分利用了栈的基础操作:

  1. push:将左括号入栈。
  2. pop:遇到右括号时,出栈并与当前右括号比较是否匹配。
  3. top:检查栈顶元素是否与当前右括号匹配。

这些操作使得我们能够高效地检查括号是否匹配。

总结与反思

括号匹配问题是一个典型的使用堆栈解决的问题。通过将左括号压入堆栈,然后在遇到相应的右括号时进行出栈匹配,我们可以有效地判断括号是否正确闭合。

原始代码虽然已经完成了任务,但存在着冗长的 if-else 语句,不够优雅。通过使用哈希表存储括号对应关系,我们能够用更简洁的代码完成同样的功能,提高代码的可读性和维护性。

括号匹配问题只是栈在算法中的一个小应用,栈还有许多其他强大的用途,如逆波兰表达式求值深度优先搜索等。掌握栈的基本操作和灵活应用,对于提升算法和数据结构的理解能力非常有帮助。

相关文章:

括号匹配问题:栈的巧妙应用与代码优化【栈、优化、哈希表】

当解决算法问题时&#xff0c;灵活使用数据结构是至关重要的。在这个问题中&#xff0c;我们需要判断一个只包含括号的字符串是否有效&#xff0c;即括号是否能够正确匹配和闭合。使用栈这一数据结构可以很好地解决这个问题。 题目链接&#xff1a;有效的括号 解题思路&#xf…...

vue项目正确使用样式deep穿透

经常开发前端的程序员应该都知道前端一般都是组件化开发&#xff0c;为了避免样式污染通常会使用scoped添加属性选择器&#xff0c;此时如果我们想在父组件中修改子组件的样式便成了难题。其实&#xff0c;我们可以通过以下几种方式修改子组件样式&#xff0c; 组件样式穿透 …...

Jenkins持续集成-快速上手

Jenkins持续集成-快速上手 注&#xff1a;Jenkins一般不单独使用&#xff0c;而是需要依赖代码仓库&#xff0c;构建工具等。 搭配组合&#xff1a;GitGitee&#xff08;GitHub、GitLab&#xff09;MavenJenkins 前置准备 常见安装方式&#xff1a; war包Docker容器实例&…...

查看linux 所有运行的应用和端口命令

要查看 Linux 中所有运行的应用程序及其对应的端口&#xff0c;可以使用以下命令&#xff1a; 1. 使用 netstat 命令&#xff08;已被弃用&#xff0c;建议使用 ss 命令&#xff09;&#xff1a; netstat -tuln 这会显示当前系统上所有打开的网络连接和监听的端口。其中&#…...

Maven安装与配置,Eclipse配置Maven【图文并茂的保姆级教程】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Maven的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Maven是什么&#xff1f; 二.Maven的下…...

利用XLL文件投递Qbot银行木马的钓鱼活动分析

1概述 近期&#xff0c;安天CERT发现了一起利用恶意Microsoft Excel加载项&#xff08;XLL&#xff09;文件投递Qbot银行木马的恶意活动。攻击者通过发送垃圾邮件来诱导用户打开附件中的XLL文件&#xff0c;一旦用户安装并激活Microsoft Excel加载项&#xff0c;恶意代码将被执…...

2023CNSS——WEB题解(持续更新)

[Baby] SignIn 进来看到 按钮点击不了&#xff0c;想到去修改代码&#xff0c;要“检查“&#xff0c;但这里的右键和F12都不可用 还好还有其他方法 检查的各种方法 选用一种后进入检查页面 删掉这里的disabled即可 点击后得到flag [Baby] Backdoor 进入&#xff0c…...

Unity之ShaderGraph 节点介绍 数学节点

数学 高级Absolute&#xff08;绝对值&#xff09;Exponential&#xff08;幂&#xff09;Length&#xff08;长度&#xff09;Log&#xff08;对数&#xff09;Modulo&#xff08;余数&#xff09;Negate&#xff08;相反数&#xff09;Normalize&#xff08;标准化矢量&…...

springboot mongo 使用

nosql对我来说&#xff0c;就是用它的变动列&#xff0c;如果列是固定的&#xff0c;我为什么不用mysql这种关系型数据库呢&#xff1f; 所以&#xff0c;现在网上搜出来的大部分&#xff0c;用实体类去接的做法&#xff0c;并不适合我的需求。 所以&#xff0c;整理记录一下…...

如何使用appuploader制作apple证书​

转载&#xff1a;如何使用appuploader制作apple证书​ 如何使用appuploader制作apple证书​ 一.证书管理​ 点击首页的证书管理 二.新建证书​ 点击“添加”&#xff0c;新建一个证书文件 免费账号制作证书只有7天有效期&#xff0c;没有推送消息功能&#xff0c;推送证书…...

Promise详细版

promise基础原理到难点分析 常见的Promise的方法解读 扩展async和await深入分析 逐步分析Promise底层逻辑代码 一、Promise基础 1.什么是promise 为了解决回调地狱&#xff1a; //2.设置点击事件btn.onclick function() {//3.创建ajax实例化对象let xhr new XMLHttpRe…...

v-for循环生成的盒子只改变当前选中的盒子的样式

1.给盒子添加动态属性:class"[index isActive?active-box:choose-box]" <div v-for"(item,index) in zyList" :key"item.sid" :class"[index isActive?active-box:choose-box]" click"getKmList(item,index)"…...

Spring Data JPA源码

导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分&#xff0c;即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and cons…...

如何防止CSRF攻击

背景 随着互联网的高速发展&#xff0c;信息安全问题已经成为企业最为关注的焦点之一&#xff0c;而前端又是引发企业安全问题的高危据点。在移动互联网时代&#xff0c;前端人员除了传统的 XSS、CSRF 等安全问题之外&#xff0c;又时常遭遇网络劫持、非法调用 Hybrid API 等新…...

linuxARM裸机学习笔记(7)----RTC实时时钟实验

基础概念&#xff1a; I.MX6U 内部也有个RTC 模块&#xff0c;但是不叫作“ RTC ”&#xff0c;而是叫做“ SNVS ”。 SNVS 直译过来就是安全的非易性存储&#xff0c; SNVS 里面主要是一些低功耗的外设&#xff0c;包括一个 安全的实时计数器 (RTC) 、一个单调计数器 (mo…...

NSS [UUCTF 2022 新生赛]ez_upload

NSS [UUCTF 2022 新生赛]ez_upload 考点&#xff1a;Apache解析漏洞 开题就是标准的上传框 起手式就是传入一个php文件&#xff0c;非常正常的有过滤。 .txt、.user.ini、.txxx都被过滤了&#xff0c;应该是白名单或者黑名单加MIME过滤&#xff0c;只允许.jpg、.png。 猜测二…...

【操作系统】操作系统知识点总结(秋招篇)

文章目录 前言操作系统主要做了哪些工作&#xff1f;进程 线程 协程之间的区别进程的组成部分介绍一下进程的PCB讲一下进程的五态 以及它们的状态转移用户态和内核态是什么&#xff1f;进程在用户态和内核态之间是如何切换的讲一下进程之间的通信方式讲一下进程调度的三个层次介…...

篇十九:迭代器模式:遍历集合

篇十九&#xff1a;"迭代器模式&#xff1a;遍历集合" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&…...

浅谈JVM中的即时编译器(Just-In-Time compiler, JIT)

Java虚拟机&#xff08;JVM&#xff09;中的即时编译器&#xff08;Just-In-Time compiler, JIT&#xff09;是一个非常重要的组件&#xff0c;它负责将字节码转换为本地机器代码。在不使用JIT的情况下&#xff0c;JVM通过解释字节码来执行程序&#xff0c;这意味着它会为每个字…...

Android 13 Launcher——长按图标弹窗内容修改以及小组件等隐藏起来

目录 一.背景 二.实现思路 三.布局文件修改 四.隐藏代码中原先的view 一.背景 由于定制化开发需要将原先的长按图标原生弹窗界面隐藏,然后显示自定义的弹窗界面,如下就是我们来实现自定义的弹窗界面...

2025身份证前六位地区代码解析:如何快速查询与使用指南

1. 身份证前六位地区代码的奥秘 每次看到身份证号码前六位数字&#xff0c;你有没有好奇过它们代表什么&#xff1f;这串看似简单的数字其实是行政区划代码&#xff0c;相当于每个地区的"身份证号"。我刚开始研究这个时也一头雾水&#xff0c;直到发现它背后藏着完整…...

AI模型代码双轨并行时代:如何用语义化版本(SemVer 3.0)管理Prompt、Weights与Pipeline?

第一章&#xff1a;AI原生软件研发版本控制最佳实践 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发显著区别于传统应用开发——模型权重、训练数据集、提示模板、评估指标与代码逻辑深度耦合&#xff0c;单一 Git 仓库难以承载多模态资产的协同演进。版本控制策…...

AI驱动的软件文档闭环:从代码提交到API文档/PRD/测试用例自动生成(实测准确率92.6%,已交付37个生产系统)

第一章&#xff1a;AI原生软件研发文档自动化生成方案 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发正面临文档滞后、语义割裂与维护成本激增的三重挑战。传统文档生成依赖人工补全或静态模板&#xff0c;难以响应代码逻辑的实时演进&#xff1b;而AI驱动的文…...

LangChain进阶(二)RAG与真实应用落地

RAG与真实应用落地...

数控自学常用的几个网站,建议收藏

CNC自学网 网址&#xff1a;https://www.cnczxw.com 老机械工程师的点评&#xff1a;这网站是块硬料&#xff0c;专搞数控的&#xff0c;从基础操作到高级编程都给你掰扯明白。教程实在&#xff0c;没那些花里胡哨的玩意儿&#xff0c;适合踏踏实实学手艺的。 我要自学网 网…...

全自动铺布机选购指南:核心指标与品牌实力评估

投资一台全自动铺布机是企业的重要决策。如何在海量品牌中做出最优选择&#xff1f;关键在于穿透营销宣传&#xff0c;从“硬指标”和“软实力”两个维度进行综合评估。核心性能指标张力控制精度&#xff1a;这是衡量铺布机性能的核心指标。直接决定能否处理针织、弹力、真丝等…...

从音频原理到实战部署:乐鑫 esp-sr SDK 核心算法与应用场景全解析

1. 声音的物理本质与数字音频基础 声音本质上是一种机械波&#xff0c;需要介质&#xff08;如空气、水或固体&#xff09;才能传播。当物体振动时&#xff0c;会使周围空气分子产生疏密变化&#xff0c;这种变化以波的形式向外扩散&#xff0c;最终被我们的耳膜捕捉并转化为神…...

小白程序员也能看懂的大模型内部原理:从加减乘除到Llama 3.1(收藏版)

本文深入浅出地解析了大语言模型&#xff08;LLM&#xff09;的工作原理&#xff0c;从基础的加减乘除运算开始&#xff0c;逐步构建一个生成式AI&#xff0c;并最终理解现代LLM和Transformer架构。文章剥去了机器学习领域的复杂术语&#xff0c;将一切还原为数字&#xff0c;帮…...

R 4.5中DESeq2用于微生物组?:权威验证——3篇Nature Microbiology复现实验揭示其在低丰度菌群中的FDR失控风险

第一章&#xff1a;R 4.5中DESeq2用于微生物组分析的范式跃迁R 4.5版本对S4对象系统、并行计算支持及Bioconductor 3.19生态的深度整合&#xff0c;显著重塑了DESeq2在微生物组研究中的应用逻辑。传统上依赖OTU表与稀疏归一化&#xff08;如CSS&#xff09;的流程&#xff0c;正…...

新手程序员必看!用缓存优化RAG,让你的大模型知识库性能飙升,收藏学习!

本文介绍了RAG在大模型知识库中的应用及其面临的性能挑战&#xff0c;提出通过结果缓存、检索结果缓存和嵌入缓存等策略来优化RAG系统。文章强调缓存机制能有效提升响应速度、降低Token消耗&#xff0c;并阐述了构建高效知识缓存体系的原则&#xff0c;如冷热分层、设置TTL和监…...