力扣32:最长有效括号

力扣32:最长有效括号

  • 题目
  • 思路
  • 代码

题目

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号 子串 的长度。

左右括号匹配,即每个左括号都有对应的右括号将其闭合的字符串是格式正确的,比如 “(()())”。

思路

方法一:栈
括号类的题目我们首先想到的是应该是用栈来做,这道题也不例外。对于这种有关最值的问题我们先不要管最值,先思考我们如何得到有效括号子串的长度。其实我们仔细想一想子串的长度不就是最后一个有效的右括号的下标减去最后一个无效的右括号下标吗,例如这个字符串")(())()“我们来观察一下有效子串的长度应该如何更新,不就是后面的右括号下标减去第一个右括号的下标吗。所以我们只要保证栈底里永远存着一个最后一个无效的右括号下标即可在我们每次匹配完成后就可以用当前下标去减去这个下标就可以得到有效括号子串的长度了。
所有我们还是正常对左右括号进行处理,遇到左括号进行push,遇到右括号进行pop同时更新最长子串的值。为了保证我们pop时栈不为空也就是如果字符串开头不是左括号而是右括号例如”())“这样,我们先对栈push一个-1。
方法二:动态规划
对于这道题我们是否还有其他的思路,当我们遇到一个有效子串也就是一个左括号一个右括号,那么新的有效长度不就是在原来的基础上进行+2吗。所以我们是否可以设置一个数组来存储以当前位置为结尾的有效子串长度。
那么对于左括号和右括号来说数组的值分别是多少呢,对于左括号来说如果以一个左括号为结尾那么有效子串长度毫无疑问就是0,而对于一个右括号来说子串的长度就需要进行讨论了。所以我们在创建数组时可以先将其全部置为0然后只对遇到右括号时再进行剩下的处理。那么遇到右括号一共不就两种情况吗前一个位置是左括号和前一个位置不是左括号,如果前一个位置是左括号那么不就匹配成功了我们就可以在原本的基础上对子串长度加2即可。关键是如果前一个位置不是左括号呢,这时候我们就需要再做一个判断也就是在去除那些有效子串后的位置是不是左括号例如这种情况”()(()())",当我们遇到最后一个右括号时我们发现它也是匹配成功的只是匹配的远了点所以我们需要判断在去除了前面的有效子串后的前一个位置是不是左括号,如果是我们就可以在数组的再前一个位置的基础上进行+2。
一样的我们发现数组的每一个位置都是答案所以这也是动态规划思想。

代码

方法一:栈

class Solution {
public:int longestValidParentheses(string s) {stack<int> st;st.push(-1);int res = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == '(') {// 如果遇到左括号就插入栈中st.push(i);} else {// 如果是右括号// 先对栈进行pop,因为我们提前插入了一个-1所以栈不可能为空st.pop();// 如果在pop后栈为空了说明从这个位置开始要重新计算长度了if (st.empty()) {st.push(i);} else {res = max(res, i - st.top());}}}return res;}
};

方法二:动态规划

class Solution {
public:int longestValidParentheses(string s) {int res = 0;int n = s.size();// 使用数组存储以当前位置为结尾的符合条件的最长子串的长度vector<int> dp(n, 0);for (int i = 1; i < n; i++) {// 如果为左括号则不用管因为以左括号为结尾肯定不符合条件if (s[i] == ')') {// 有两种情况,i-1是左括号或者右括号if (s[i - 1] == '(') {// 如果是左括号则说明括号匹配上了dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;}// 如果为右括号// 还需要判断去除前面的有效括号后的那位字符是不是左括号// 如果是就匹配上了else if (i - dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(') {dp[i] = dp[i - 1] +(i - dp[i - 1] >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;}res = max(res, dp[i]);}}return res;}
};

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

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

相关文章

机器学习实例应用

K最近邻算法K近邻算法(KNN,k-Nearest Neighbor),每个样本都可以用它的最接近的K个邻近值来代表。算法说明&#xff1a;①输入没有标签的新数据&#xff0c;将新数据的每个特征与样本集中数据对应的特征进行比较&#xff0c;然后算法提取样本集中特征最相似数据&#xff08;最近…

力扣 hot100 Day77

连做了几个动态规划的中等题&#xff0c;还是比较有套路的&#xff0c;这里只简要分析一下最长递增子序列&#xff0c;设定dp[i]为以nums[i]结尾的最长子序列&#xff0c;递推公式就好推了乘积最大子数组&#xff0c;和上面类似&#xff0c;但考虑到负负得正&#xff0c;所以需…

深入解析RabbitMQ与AMQP-CPP:从原理到实战应用

一、RabbitMQ安装 1.安装 RabbitMQ sudo apt install rabbitmq-serverRabbitMQ 的简单使用 # 启动服务 sudo systemctl start rabbitmq-server.service # 查看服务状态 sudo systemctl status rabbitmq-server.service # 安装完成的时候默认有个用户 guest &#xff0c;但是权限…

(论文速读)ViDAR:视觉自动驾驶预训练框架

论文题目&#xff1a;Visual Point Cloud Forecasting enables Scalable Autonomous Driving&#xff08;视觉点云预测实现可扩展的自动驾驶&#xff09; 会议&#xff1a;CVPR2024 摘要&#xff1a;与对通用视觉的广泛研究相比&#xff0c;可扩展视觉自动驾驶的预训练很少被探…

《Unity Shader入门精要》学习笔记二

1、基础光照&#xff08;1&#xff09;看世界的光模拟真实的光照环境来生成一张图像&#xff0c;需要考虑3种物理现象。光线从光源中被发射出来。光线和场景中的一些物体相交&#xff1a;一些光线被物体吸收了&#xff0c;而另一些光线被散射到其他方向摄像机吸收了一些光&…

Windchill 11.0使用枚举类型自定义实用程序实现生命周期状态管理

一、Enumerated Type Customization Utility 枚举类型自定义实用程序,可用于添加或编辑枚举类型的值,在Windchill 12.0+中可直接在类型和属性管理中编辑,如下图所示,而在Windchill 11.0中只能通过windchill shell启动程序,下面将详细介绍Windchill 11.0中启动并使用枚举类…

UGUI源码剖析(10):总结——基于源码分析的UGUI设计原则与性能优化策略

UGUI源码剖析&#xff08;第十章&#xff09;&#xff1a;总结——基于源码分析的UGUI设计原则与性能优化策略 本系列文章对UGUI的核心组件与系统进行了深入的源代码级分析。本章旨在对前述内容进行系统性总结&#xff0c;提炼出UGUI框架最核心的设计原则&#xff0c;并基于这些…

STM32N6引入NPU,为边缘AI插上“隐形的翅膀”

2025年的春天格外特别。伴随着人形机器人、DeepSeek的强势刷屏&#xff0c;AI成了最有前景的赛道。万物皆可AI&#xff0c;万物也在寻觅用上AI或者让AI“转正”的“aha moment”。 帮助机器更好地“思考”&#xff0c;让更多的AI走向边缘&#xff0c;是AI发展的重要趋势之一。…

演练:使用VB开发多智能体协作的荣格八维分析器

在大语言模型高速发展的时代&#xff0c;我们面对困难的语义分析任务&#xff0c;通过构建智能体进行处理是一个流行趋势。本文将介绍如何使用 Visual Basic .NET 开发一个多智能体协作系统&#xff0c;用于分析聊天记录中特定人物的荣格八维人格类型。 本文使用 CC-BY-NC-SA …

llamafactory使用qlora训练

llamafactory使用qlora训练 1.环境搭建 conda create -n qlora python3.10 -y conda activate qlora# 克隆LLaMA-Factory仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git# 进入仓库目录 cd LLaMA-Factory# 切换到0.9.4版本 git checkout v0.9.4pip install -e .2…

模型微调/量化技术整理

一、模型微调技术1.模型微调简介大模型微调(Fine-tuning)&#xff0c;是指在已经预训练好的大语言模型基础上&#xff08;基座模型&#xff09;&#xff0c;使用特定的数据集进行进一步训练&#xff0c;让模型适应特定任务或领域。通常LLM的预训练是无监督的&#xff0c;但微调…

实践笔记-VSCode与IDE同步问题解决指南;程序总是进入中断服务程序。

一、VSCode 修改文件后&#xff0c;IDE 未同步如果你在 VSCode 中异步修改了项目文件内容&#xff0c;但 S32DS 或 Keil&#xff08;等集成开发环境&#xff09;中的项目没有同步更新&#xff0c;有两个解决方法&#xff1a;检查文件是否已保存&#xff1a;确保 VSCode 中修改的…

C#WPF实战出真汁04--登录功能实现

1、登录功能实现要点对于登录系统&#xff0c;应该注意几个要点&#xff1a;用户认证流程设计&#xff0c;密码存储与验证&#xff0c;会话管理&#xff0c;防暴力破解措施&#xff0c;错误处理与提示2、登录功能的视图模型首先在xaml文件中必须指定该页面使用的视图模型&#…

鸿蒙入门简化版

第一步&#xff1a; 首先下载DEVStudio https://developer.huawei.com/consumer/cn/deveco-studio/ 第二步&#xff1a; 了解基本的ArkTs语言 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/introduction-to-arkts 第三步 &#xff1a; 教学视频有两个途径&a…

day25|学习前端js

函数声明&#xff0c;被提升&#xff08;hoisting&#xff09;。函数表达式必须先定义才能用。对象解构&#xff0c;按属性名数组解构按顺序点运算符. 对象.属性名哪些可迭代&#xff08;可以被for..of循环的东西&#xff09;&#xff1a;array&#xff0c;string&#xff0c;m…

quic协议与应用开发

quic为什么出现&#xff1f;quic主要是为了解决TCP协议的局限性而提出的&#xff0c;具体来说是要解决如下问题&#xff1a;1. 加密连接建立时间长TCP协议是传输层协议&#xff0c;而TLS是会话层协议&#xff0c;在Linux等主流操作系统中TCP在内核实现而TLS一般在用户态实现&am…

【浅学】tflite-micro + ESP32S3 + VScode + ESP-IDF 基于例程快速实现自己的图像分类模型训练部署全流程

如果你用Pytorch训练的模型那么可以参考我的步骤&#xff0c;使用的是Tensorflow的话参考官方文档即可&#xff0c;但流程都是一样的&#xff0c;每一步我都会提到部分操作细节及注意事项 官方教程 要详细学习的话tflite-micro里的微控制器章节下都详细看&#xff08;页面左侧…

【HarmonyOS】应用设置全屏和安全区域详解

【HarmonyOS】应用设置全屏和安全区域详解 一、前言 IDE创建的鸿蒙应用&#xff0c;默认采取组件安全区布局方案。顶部会预留状态栏区域&#xff0c;底部会预留导航条区域。这就是所谓的安全区域。 如果不处理&#xff0c;界面效果很割裂。所以业内UI交互设计&#xff0c;都会设…

openfeign 只有接口如何创建bean的

OpenFeign 能够为纯接口创建 Spring Bean&#xff0c;其核心机制是通过动态代理和 Spring 的 FactoryBean 机制实现的。以下是详细的工作原理&#xff1a;1. EnableFeignClients 注解的启动在 Spring Boot 主类上添加 EnableFeignClients 注解&#xff1a;SpringBootApplicatio…

【展厅多媒体】互动地砖屏怎么提升展厅互动感的?

在数字化展厅设计中&#xff0c;互动地砖屏 正成为提升观众参与度的重要工具。这种融合视觉科技与交互体验的装置&#xff0c;通过动态影像与即时反馈&#xff0c;让参观者从被动观看转变为主动探索&#xff0c;从而大幅增强展厅的互动感。 Led地面互动屏的优势在于其强大的视…