LeetCode第32题 : 最长有效括号

题目介绍

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

示例 1:

输入:s = "(()"

输出:2

解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"

输出:4

解释:最长有效括号子串是 "()()"

使用栈解决

这题让求的是最长有效括号长度,一个有效的括号一定是满足下面两个条件:

  • 左括号和右括号的数量一定是相等的。

  • 在有效括号的任何位置左括号的数量一定是大于等于右括号的数量。

根据这两个特性我们可以使用栈来解决,栈中存放的是字符的下标,解决思路就是:

  • 如果遇到左括号我们就把他的下标压栈。

  • 如果遇到右括号,栈顶元素出栈,如果栈不为空说明出栈的元素和这个右括号匹配,我们需要计算他们的长度,保留最大值即可。如果栈为空,直接把这个右括号所在的下标压栈。

这里要注意如果给定的字符串从一开始就是有效的括号,比如"()())"前4个符号是有效的括号,我们是没法计算他的长度的,因为第一个字符前面是没有字符的,所以我们默认第一个字符前面的下标是-1,然后把他压栈,我们以示例2为例画个图来看下。

最后看下代码:

class Solution {
public:
    int flags[20000];
    int longestValidParentheses(string s) {
        int n = s.size();
        stack<int> stk;//存储的是下标
        for(int i = 0; i < n; ++i){
            if(s[i] == '(') 
                stk.push(i);//左括号push
            else{
                if(stk.empty())   
                    flags[i] = 1;
                else    
                    stk.pop();
            }
        }
        
        while(!stk.empty()){
            flags[stk.top()] = 1;
            stk.pop();
        }
        
        int res = 0, len = 0;
        for(int i = 0; i < n; ++i){
            if(flags[i] == 0)   
                ++len;
            else{
                res = max(res, len);//长度更新
                len = 0;
            }
        }
        return max(res, len);//可能需要考虑最后的位
    }
};

动态规划

再来看下动态规划该怎么解决,我们用dp[i]表示以是s[i]为结尾的最长有效括号长度,如果要计算dp[i]就会有下面几种情况:

  • 第i个字符是左括号"(",那么以他结尾的是构不成有效括号的,所以dp[i]=0;

  • 第i个字符是右括号")",那么以他结尾的是有可能构成有效括号的,所以还需要继续判断:

  1. 这里我们需要判断他前面的也就是第i-1个字符,如果第i-1个字符是左括号"(",类似于……(),那么最长有效括号就是第i-2个字符之前构成的最长有效括号+2,也就是dp[i]=dp[i-2]+2。

  2. 如果第i-1个字符也是右括号")",类似于……((……)),如下图所示,我们还需要判断第i -1- dp[i - 1]个字符是否是左括号"(",如果是"(",那么递推公式是dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2],这里dp[i - dp[i - 1] - 2]是第一个省略号构成的有效括号长度,这个不要忘了。

最后看下代码:

class Solution {
public:
    int dp[20000];
    int longestValidParentheses(string s) {
        int n = s.size();
        for(int i = 1; i < n; ++i){
            if(s[i] == ')'){//合法的子串一定以右括号结尾
                if(s[i-1] == '(')  
                    dp[i+1] = dp[i-1] + 2; 
                else if(i-1-dp[i] >= 0 && s[i-1-dp[i]] == '(')  
                    dp[i+1] = dp[i] + dp[i-1-dp[i]] + 2;
            } 
        }
        return *max_element(dp+1, dp+n+1);
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合mybatis多数据源

废话不多说先上结果 对应数据库 首先导入所需的mybatis、mysql和lombok依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependen…

关于我花费六千多组了台window+Linux主机

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 我在2023年12月组了一台“洋垃圾”的主机&#xff0c;一边当做台式机使用&#xff0c;一边当做服务器使用。这个方案算是相对比较划算的方案。我开始是打算直接单做服务器使用的&#xff0c;以及内存…

【好书推荐】只更新软件,座椅为何能获得加热功能?《一书读懂物联网:基础知识+运行机制+工程实现》

文章目录 什么是OTA&#xff1f;OTA方案的特点时间短、效率高合理使用无线资源&#xff0c;提升终端更新的服务效率高可靠性通用性 OTA系统的参考架构和服务流程结语 2020年&#xff0c;特斯拉发布过一次OTA更新&#xff0c;车主可以通过这次系统更新获得座椅加热功能。当时&am…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…

LiveGBS国标GB/T28181流媒体平台功能-国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话

LiveGBS国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入LiveGBS示例 4、配置国标…

脆弱的SSL加密算法漏洞原理以及修复方法

漏洞名称&#xff1a;弱加密算法、脆弱的加密算法、脆弱的SSL加密算法、openssl的FREAK Attack漏洞 漏洞描述&#xff1a;脆弱的SSL加密算法&#xff0c;是一种常见的漏洞&#xff0c;且至今仍有大量软件支持低强度的加密协议&#xff0c;包括部分版本的openssl。其实&#xf…

【深度学习-图像分类】03 - VGG 论文学习与总结

论文地址&#xff1a;VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 论文学习 1. 摘要 这篇论文探讨了在大规模图像识别任务中&#xff0c;卷积神经网络&#xff08;ConvNets&#xff09;深度对其准确性的影响。作者的主要贡献是对不断增加深度的网络…

mybatis-flex笔记

MyBatis-Flex 的增删改功能 - MyBatis-Flex 官方网站https://mybatis-flex.com/zh/base/add-delete-update.html 代码https://gitee.com/hntianshu/mybatis-flex-test 一 新增数据 不忽略 null 值。 就是允许有null 忽略null 就是不允许有null BaseMapper 的接口提供了 inser…

Vue3-33-路由-路由的别名配置 alias

别名的作用 路由中的别名配置&#xff0c;可以实现 多个路径 对应 同一个路由。 例如 &#xff1a; 路由的路径是 /a; 配置别名为 &#xff1a; /a2; 则 访问 /a 或 /a2 的时候&#xff0c;都可以访问到 同一个组件。 别名的特点 关键字 &#xff1a; alias 当通过别名进行路由…

将 Python 和 Rust 融合在一起,为 pyQuil® 4.0 带来和谐

文章目录 前言设定方向从 Rust 库构建 Python 软件包改装 pyQuil异步困境回报&#xff1a;功能和性能结论 前言 pyQuil 一直是在 Rigetti 量子处理单元&#xff08;QPUs&#xff09;上构建和运行量子程序的基石&#xff0c;通过我们的 Quantum Cloud Services&#xff08;QCS™…

擎创技术流 |如何使用eBPF监控NAT转换

一、NAT简介 Linux NAT&#xff08;Network Address Translation&#xff09;转换是一种网络技术&#xff0c;用于将一个或多个私有网络内的IP地址转换为一个公共的IP地址&#xff0c;以便与互联网通信。 图源于网络 在k8s业务场景中&#xff0c;业务组件之间的关系十分复杂. …

【LabVIEW FPGA入门】创建第一个LabVIEW FPGA程序

本教程仅以compactRIO&#xff08;FPGA-RT&#xff09;举例 1.系统配置 1.1软件安装 FPGA-RT 1. LabVIEW Development System (Full or Professional) 2. LabVIEW Real-Time Module 3. LabVIEW FPGA Module 4. NI-RIO drivers 1.2硬件配置 1.使用线缆连接CompactRIO至主机…

OpenHarmony之HDF驱动框架

概述 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路&#xff0c;让驱动开发和部署更加规范&#xff0c;旨在…

鸟类识别与分类

Littro 双波段T型云台成像AI一体机是利卓公司结合了红外热成像、可见光相机与边缘计算为一体的整机产品。 产品同时支持双波段成像&#xff0c;基于瞳赋Tofu3智能识别模块的AI算法可以克服因光线不足、背景复杂造成的诸多不利因素&#xff0c;完成目标检测、识别、跟踪等多种功…

RabbitMQ集群的简单说明

1.普通集群(副本集群) 当集群中某一时刻master主节点宕机&#xff0c;可以对master中Queue中的消息进行备份。而就算master宕机了&#xff0c;从节点不会对外提供服务&#xff0c;等到master节点恢复后&#xff0c;系统才会恢复正常。 主从架构的缺点是队列中的消息只是位于主节…

51单片机之LED灯

51单片机之LED灯 &#x1f334;前言&#xff1a;&#x1f3ee;点亮LED灯的原理&#x1f498;点亮你的第一个LED灯&#x1f498;点亮你的八个LED灯 &#x1f4cc;让LED灯闪烁的原理&#x1f3bd; LED灯的闪烁&#x1f3d3;错误示范1&#x1f3d3;正确的LED闪烁代码应该是这样&am…

玩转数据世界:跨工作空间的安全授权与高效查询

前言 随着数字化时代的来临&#xff0c;数据已经成为了企业和组织的核心资产。如何安全有效地管理和利用这些数据&#xff0c;成为了各行业共同面临的挑战。尤其是在多个工作空间或部门之间&#xff0c;数据的共享、查询和分析往往涉及到复杂的权限管理&#xff0c;影响组织的…

移动CRM系统有哪些具体的应用场景?移动CRM好用吗?

大家好我是卡林&#xff0c;最近杭州亚运会盛大举办&#xff0c;外国友人在打卡各地美食景点的同时也体会到了移动支付的乐趣。在智能手机全面普及的今天&#xff0c;移动CRM系统的应用也越来越广泛&#xff0c;移动CRM系统的应用场景有哪些&#xff1f;移动办公、签到打卡、销…

【C语言】Linux socket 编程

一、Socket 通信过程 在 Linux 系统中&#xff0c;socket 是一种特殊的文件描述符&#xff0c;用于在网络中的不同主机间或者同一台主机中的不同进程间进行双向通信。它是通信链路的端点&#xff0c;可以看作是网络通信的接口。Socket 通信过程主要分为以下几个步骤&#xff1a…

【算法】利用分治思想解算法题:快排、归并、快速选择实战(C++)

1. 分治思想 介绍 分治法将问题划分成多个相互独立且相同或类似的子问题&#xff0c;然后递归地解决每个子问题&#xff0c;并将结果合并以得到原始问题的解。 分治思想通常包含以下三个步骤&#xff1a; 分解&#xff1a;将原始问题划分成多个规模较小、相互独立且类似的子…