图解LeetCode:Longest Valid Parentheses

【实战】ACM 选手图解 LeetCode 有序数组的平方 图解 LeetCode 977:有序数组的平方。 阅读详情


给定一个字符串,其中只包含左括号’(’ 以及右括号 ‘)’,要求返回最长的匹配括号长度。

比如给定"(()",那么我们的函数需要返回2,因为最长的匹配括号是"()";

比如给定")()())",那么我们的函数需要返回4,因为最长的匹配括号是"()()";

如果在面试的时候遇到这个题目,你该如何解决呢?

 

我的思考过程

首先我们要明确的就是什么样的字符串才是匹配的括号,其实很简单,那就是如果一个括号串中的左括号"(“和右括号”)"都能相互抵消掉,那么我们就说这是匹配的括号;

比如给定"())",其中"()“能抵消掉,剩下的”)“就没有对应的”("来抵消,这样的字符串就不满足要求;

对于"(()())",其中中间的两个"()()“能抵消掉,最后剩下一个”()"也能抵消,这样的字符串就满足要求;

从上面的分析过程可以看到这其实可以用栈这种数据结构来进行判断,很简单,只要是"(“就入栈,遇到右括号”)“就去看一下当前的栈顶是不是”(",如果是,那么就出栈,否则继续入栈,最后判断一下如果栈为空,那么该字符串就满足要求,如图所示:

在这里插入图片描述
这个分析可能有的同学觉得无聊,这不是很显而易见的吗,但就是这个显而易见的分析实际上就是该问题的解决方法。

 

计算最长匹配括号

什么情况下才可以计算最长的匹配括号,答案很显然,那就是出栈时,因为在出栈时我们能确定此时一定有一个匹配的括号产生,那么接下来的问题就是如何计算这个匹配括号的长度。

如果你不知道这个问题的答案,那么你需要再仔细的看一看上图,如果你还看不出来,那么下图应该能帮到你:

在这里插入图片描述

从上面的分析我们可以看出只要每次出栈的时候用当前的位置减去栈顶的位置就是本次形成的匹配字符串长度,只需要在遍历时记录下最大的那个长度就可以了。

接下来我们用一个示例")((()())"来说明这个过程。

 

图解计算过程

下图就是以上分析过程的图形化,以字符串为例")((()())"来说明:

在这里插入图片描述

有了这些分析,代码不要太简单。

 

代码实现
int longestValidParentheses(string s) {
    int len = s.length();
    if (len == 0)
        return 0;
    int r = 0;
    stack<int>st;
    for(int i=0;i<len;i++){
        if (s[i] == '('){
            st.push(i);
        } else {
            if (st.empty() || s[st.top()] == ')') {
                st.push(i);
            } else {
                int top = st.top();
                st.pop();
                r = max(r, st.empty()? i+1 : i-st.top());
            }
        }
    }
    return r;
}

唯一需要注意的是在计算匹配括号长度时需要判断当前栈是否为空,如果为空,那么说明从当前位置到字符串开头都是匹配的。

 

总结

从这个题目可以看出有时问题的答案就藏在问题本身的定义中,希望这个题目能让你对栈这种数据结构有一种新的认知,栈有十分有趣而且极其重要的性质,在后面的文章中我们还会多次见到栈,并能看到用栈可以使用很多十分精妙的算法。

更多计算机内功文章,欢迎关注微信公共账号:码农的荒岛求生。

在这里插入图片描述
彻底理解操作系统系列文章
1,什么程序?
2,进程?程序?傻傻分不清
3,程序员应如何理解内存:上篇
4,程序员应如何理解内存:下篇
 
 

计算机内功决定程序员职业生涯高度

Zynq远程更新程序实战:从emmc到flash的完整方案解析 本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。 阅读详情

相关推荐

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 152

详细图解LeetCode经典链表算法题

常见链表相关算法题。欢迎指正!!!

qq_54353206的博客 1912

CLCD土地覆盖数据在ArcGIS中的实战应用:从导入到空间分析的完整指南

本文详细介绍了CLCD土地覆盖数据在ArcGIS中的实战应用,从数据导入到空间分析的完整流程。涵盖坐标系转换、数据质量检查、土地利用变化检测等核心技术,并分享城市扩张模拟和跨数据集融合等高级应用技巧,帮助研究者高效利用这一权威数据集进行环境监测和城市规划。

weixin_29292535的博客 590

图解 LeetCode 算法汇总——链表

链表相对数组来说,在定义的时候不需要确定好内存大小,因为链表的通过指针可以存储非连续空间的数据。链表的查询需要通过指针一个个找到对应的结点,而不能像数组一样通过索引直接找到对应的数据。在 JDK 中也会使用双链表,双链表更占内存,因为多了一个指针,带来的好处是查询数据可以从前往后查,也可以从后往前查,用空间换时间。反转链表反转指针方向,结点数据不会改变。

qq_42700121的博客 569

告别‘打架’的检测头:手把手教你用PyTorch实现YOLOv11解耦头(附完整代码)

本文详细解析了YOLOv11解耦检测头的创新设计与PyTorch实现,通过解耦分类和回归任务,显著提升目标检测性能。文章包含完整的代码实现、架构设计解析及工程调优技巧,帮助开发者深入理解并应用这一先进技术。

weixin_29031057的博客 301

升级最新IDEA版本(2022.1.1)

升级最新IDEA版本(2022.1.1)

软件老王 3万+

刷穿LeetCode1500题解(最优解法+图解+保姆级注释)【T1 ~ T10】

【代码】刷穿LeetCode1500题解(最优解法+图解+保姆级注释)【T1 ~ T10】

coooode_king的博客 337

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3266

【leetcode】Longest Valid Parentheses 详细讲解

题目:给定一串仅由' ( '和 ' ) '组成的括号字符串s,由于整个括号串可能不全部匹配,但可能存在部分匹配,返回匹配的最长的括号数。 分析:注意题目中红色加粗的部分,它给我们解这道题带来了很大的便利,因为在当前访问到‘)’ 时,我们不用去判断栈顶元素是否为 ‘(’,因为没有除二者之外的字符,‘)’又不入栈,所以只要判断当前栈不空,那么就肯定是‘(’,肯定就是一个匹配的括号对。 由于要返回

shiquxinkong的专栏 1216

AI:270-基于ASFF改进YOLOv8检测头的多尺度特征融合方法详解与实战

ASFF是一种基于自适应特征融合的策略,能够动态调整不同尺度特征的融合权重,适应场景中不同大小的目标。传统的YOLOv8检测头使用固定的特征融合策略,而ASFF则通过引入学习参数,使得网络能够根据输入图像的特征自适应地选择不同尺度特征的重要性。这一策略对于检测小目标或尺度变化大的目标具有显著优势。本文提出了一种改进YOLOv8检测头的新方法,通过引入自适应空间特征融合模块(ASFF),有效提升了多尺度目标检测的性能,特别是在小目标检测任务中的表现。

一键难忘的博客 3910

基于STM32设计的智能水产养殖系统(华为云IOT)(152)

当前设计的智能水产养殖系统主控芯片采用STM32F103RCT6,可以实现对水位、水温、水混浊度和PH值等参数的监测和控制,并且支持定时投喂功能。通过连接华为云物联网平台,将传感器数据上传到服务器,并通过Qt设计的Android手机APP来获取设备上传的数据,从而实现对养殖环境的远程监测和控制。

8826

[leetcode]Longest Valid Parentheses题解

题目: Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring. For "(()", the longest valid parentheses substring is "()",

牧之 873

开发simulink 以及stm32半物理仿真碰到的问题,以及处理方法,Error:External Mode Open Protocol Connect command failed(实测有用)

串口实现的,但是在测试的时候发现,这个串口可以正常发送和接收数据,但是一旦把这个串口只让其进行版物理仿真就报错。直接刷写程序是可以的,最后查到问题了。我要实现半物理仿真,就是通过matlab实现可以直接控制stm32板子,实际上是通过xcp on。然后点击simulink上的观测按钮就可以直接和stm32平台进行通讯了。3,还是使用串口3,但是重新需要设置一下com口,因为重新插拔了一下,按照这个设置方法就可以。2,重新加载ioc文件。

pvmsmfchcs的博客 1498

深入Google Test与Google Mock源码:从原理到实战的单元测试进阶指南

单元测试是保障软件质量、提升开发效率的核心工程实践。其原理在于通过隔离代码单元,验证其行为是否符合预期,从而在早期发现缺陷,降低维护成本。在C++生态中,Google Test和Google Mock作为业界标杆测试框架,其技术价值在于提供了强大的断言、模拟和测试组织能力,能有效应对复杂模块的测试需求。通过深入源码理解其“测试即对象”和“期望即契约”的设计哲学,开发者可以掌握自定义断言、模拟复杂交互、定制测试报告等高级技巧,最终将源码层面的理解转化为解决实际测试难题的能力,例如调试诡异的测试失败或集成到CI

weixin_30599769的博客 409

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode 图解 | 18.四数之和

点击上方蓝字设为星标下面开始今天的学习~来源:算法无遗策今天分享的题目来源于 LeetCode 第 18 号题:四数之和,题目标签是:散列表、双指针和数组。题目描述 给定一个包含 n 个...

程序员吴师兄的博客 922

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

接雨水 LeetCode 算法图解

昨天睡前 刷 LeetCode 题,看到个大佬写的,接雨水的答案很简洁,所以今天有空又去看了下,顺手做了个图解。 问题: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图。 在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水) 这是大佬写的答案 ...

Varalpha的博客 634

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

LeetCode Longest Valid Parentheses

找出一个只包含”(“和”)”的字符串中最长的有效子字符串的长度。有效的意思是指该子字符串中的括号都能正确匹配。

DRFish 1498

图解leetcode206.反转链表

1.题目描述: 给你单链表的头节点head,请你反转链表,并返回反转后的链表。 2.使用list集合记录节点信息再取出,思路较简单,直接放代码: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * .

kkkkuuga的博客 419

leetcode 之 Longest Valid Parentheses

leetcode中和括号匹配相关的问题共有三个,分别是: Valid Parentheses   Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. The brackets m

fangjian1204的专栏 1543

LeetCode Longest Valid Parentheses 解题报告

分析,求出一串由:‘(’和‘)’组成的字符串中最长有效括号的长度。例如:(()(),结果是4。((()))结果是6。())()()结果是4。

算法的天空 1万+

【LeetCode每天一题】Longest Valid Parentheses(最长有效括弧)

Given a string containing just the characters'('and')', find the length of the longest valid (well-formed) parentheses substring. Example 1: Input: "(()" O...

aoaichen0637的博客 214

LeetCode算法入门- Longest Valid Parentheses -day12

LeetCode算法入门- Longest Valid Parentheses -day12 Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring. 题目描述: 题目的意思是给定一个括号序列...

hongjie_lin 283

LeetCode 图解 | 290 . 单词规律

文 |景禹来源:图解面试算法「ID: LeetCodeAnimation」题目来源于 LeetCode 上第 290 号问题:单词规律。题目难度为 Easy,目前通过率为 42.4%...

程序员吴师兄的博客 469

LeetCode--longest-valid-parentheses

题目描述 Given a string containing just the characters'('and')', find the length of the longest valid (well-formed) parentheses substring. For"(()", the longest valid parentheses substring

wl_ss的博客 341

LeetCode题目图解汇总

GitHub Repo:LeetCodeAnimation Follow: MisterBooo · GitHub There is an English version of README here. just click it! 我会尽力将LeetCode上所有的题目都用动画的形式演示出来,计划用3到4年时间去完成它,期待与你见证这一天! 文章最新首发于微信公众号 五分钟学算法 ,您可以...

weixin_34205826的博客 528

【LeetCode】32. Longest Valid Parentheses【栈&动态规划】

       它的标题基本就是题目了,找出连续的最长有效括号的长度,再看一下原题的两个栗子就更明显了,尤其是第二个栗子中的()()部分,更是此题的一个关键,后面还会经常提起。这道题题意相当简单,思路相当简洁,代码相当简短,但是感觉想起来没有那么简单,做完有一种相当巧妙的感觉,所以分享出来。 Given a string containing just the characters '(' an...

zhaoqinmuxue的博客 312
上一篇: 图解LeetCode:Divide Two Integers
下一篇: 图解LeetCode:单词梯子
码农的荒岛求生
博客等级 码龄10年 969粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值