60 最长有效括号

news2024/12/23 17:43:49

最长有效括号

  • 题目描述
    • 题解1 DP+stack
    • 题解2 stack
    • 题解3 DP
    • 题解4 左右指针

题目描述

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

示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:
输入:s = ""
输出:0

题解1 DP+stack

class Solution {
public:
    int longestValidParentheses(string s) {
        int st = s.size();
        if(0 == st) return 0;
        stack<int> stk;
        vector<int> dp(st+1, 0);

        for(int i = 0; i < st; i++){
            if(s[i] == '('){
                stk.push(i);
                // 如果是左括号说明i位置不会有效,对应在dp里i+1位置置零即可
                dp[i+1] = 0;
            }else{
                if(! stk.empty()){
                // 如果没有stack,递推公式稍微复杂一点
                // key:别忘了+dp[stk.top()]
                // 以防迷惑:stk.top()是最近的左括号下标值,dp[stk.top()+1]=0
                    dp[i+1] = i + 1 - stk.top() + dp[stk.top()];
                    stk.pop(); 
                }else dp[i+1] = 0;
            }
                
        }
        int ret = INT_MIN;
        for(auto& i : dp){
            ret = max(ret, i);
        }
        return ret;
    }
};

在这里插入图片描述

题解2 stack

class Solution {
public:
    int longestValidParentheses(string s) {
        int st = s.size();
        if(0 == st) return 0;
        stack<int> stk;
        // 处理第一个字符是左括号的情况
        stk.push(-1);
        int ret = 0;
        for(int i = 0; i < st; i++){
            if(s[i] == '('){
                stk.push(i);
            }else{
                // 遇到右括号,先弹栈(遇到右括号,前面的连续有效括号就作废了)
                stk.pop();
                if(! stk.empty()){
                    ret = max(ret, i-stk.top());
                }else {
                    stk.push(i);
                }
            }
                
        }
        return ret;
    }
};

在这里插入图片描述

题解3 DP

class Solution {
public:
    int longestValidParentheses(string s) {
        int st = s.size();
        if(0 == st) return 0;
        vector<int> dp(st, 0);
        int maxS = 0; 
        for(int i = 1; i < st; i++){
            if(s[i] == ')'){
            // "()()"
                if(s[i-1] == '('){
                    dp[i] = 2;
                    // 前面还有项(如果有stack就会马上定位到上一个有效序列的开始)
                    if(i >= 2)
                        dp[i] = dp[i-2] + dp[i];
                }
            	// "(())"
                else if(dp[i-1]){
                
                    if(i-1-dp[i-1] >= 0 && s[i-1-dp[i-1]] == '('){
                        dp[i] = dp[i-1] + 2;
                        // 前面还有项
                        if(i - dp[i-1] - 2 >= 0)
                            dp[i] = dp[i] + dp[i - dp[i - 1] - 2];
                    }    
                }                    
            }
            maxS = max(maxS, dp[i]);
        }
        return maxS;
    }
};

在这里插入图片描述

题解4 左右指针

class Solution {
public:
    int longestValidParentheses(string s) {
        int left = 0, right = 0, maxlength = 0;
        // 左扫
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == '(') {
                left++;
            } else {
                right++;
            }
            if (left == right) {
                maxlength = max(maxlength, 2 * right);
            } else if (right > left) {
                left = right = 0;
            }
        }
        left = right = 0;
        // 右扫:解决左扫扫不出来的"(((()"
        for (int i = (int)s.length() - 1; i >= 0; i--) {
            if (s[i] == '(') {
                left++;
            } else {
                right++;
            }
            if (left == right) {
                maxlength = max(maxlength, 2 * left);
            } else if (left > right) {
                left = right = 0;
            }
        }
        return maxlength;
    }
};

在这里插入图片描述

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

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

相关文章

CTF Reverse入门(1) 环境安装

前言 逆向重点是分析和理解计算机程序、二进制文件或者其他软件的逆向工程技术。在CTF比赛中&#xff0c;参赛者通常会收到一个或多个二进制文件、程序、固件或者其他类型的软件&#xff0c;他们的任务是分析这些文件&#xff0c;识别潜在的漏洞或安全问题。 学逆向需要会密码…

(三)QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

先添加一个带有ui的QT应用程序。 一、在ui界面中添加QVTKOpenGLNativeWidget控件 先拖出来一个QOpenGLWidget控件 修改布局如下&#xff1a; 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件&#xff0c;步骤如下&#xff1a; 右击QOpenGLWidget窗口&#xff0c;选…

【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

文章目录 一、堆栈1. 定义2. 基本操作 二、顺序栈0. 顺序表1. 头文件和常量2. 栈结构体3. 栈的初始化4. 判断栈是否为空5. 判断栈是否已满6. 入栈7. 出栈8. 查看栈顶元素9. 清空栈10. 主函数11. 代码整合 堆栈Stack 和 队列Queue是两种非常重要的数据结构&#xff0c;两者都是特…

公司oa是什么?一般公司oa有什么样功能?

公司OA&#xff08;Office Automation&#xff09;是指通过计算机和信息技术来实现办公自动化的系统。 它提供了一系列的功能和工具&#xff0c;用于协调、管理和处理公司内部的日常事务和流程。OA系统旨在提高工作效率、加强信息交流与共享、简化业务流程&#xff0c;并提供便…

2023年中国人力资源服务外包市场规模、机构数量及细分领域规模[图]

人力资源服务外包是企业根据需要将某一项或几项人力资源管理工作或职能外包出去&#xff0c;交由其他企业或组织进行管理&#xff0c;以降低人力成本&#xff0c;实现效率最大化&#xff0c;企业专注自身核心业务发展。人力资源外包业务包括人事管理、人才派遣、薪酬财税、健康…

思维模型 晕轮效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。 1 晕轮效应应用 1.1 面试中的晕轮效应 一位外表英俊、谈吐得体的男士在面试中表现出色&#xff0c;面试官对他印象极佳&#xff0c;认为他具备领导才能和优秀的沟通能力。然而&#xff0…

Mac M1编译 swift 5.8.1源码

参考链接&#xff1a;https://github.com/apple/swift/blob/main/docs/HowToGuides/GettingStarted.md#system-requirements 编译 Swift 5.8 源码-六虎 解决M1芯片的Homebrew安装问题--For M1使用者_m1 homebrew安装_a_52hz的博客-CSDN博客 建议全程梯子 一、检查和配置环境…

丈母娘说:有编制的不如搞编程的

10月17日百度世界大会召开&#xff0c;据说文心大模型又牛X了&#xff0c;综合水平相比GPT4毫不逊色&#xff0c;真是个让人激动的消息&#xff0c;国产大模型的进展可以说是日新月异&#xff0c;我这耳朵边一直响彻四个字&#xff1a;遥遥领先。 不过今天我关注的重点不是什么…

ant的FileSet资源集合

一个FileSet是一组文件&#xff0c;这些文件可以通过从基目录开始的目录树中找到FileSet可以指定模式集和选取器来进行过滤和选择。 FileSet隐含已经支持的模式集<include>, <includesfile>, <exclude> 和 <excludesfile>&#xff0c;它们作为FileSet的…

02、MySQL-------主从复制

目录 七、MySql主从复制启动主从复制&#xff1a;原理&#xff1a;实现&#xff1a;1、创建节点2、创建数据库3、主从配置1、主节点2、从节点 4、测试&#xff1a;5、问题&#xff1a;1、uuid修改2、service_id3、读写不同步方法1&#xff1a;方法2&#xff1a; 七、MySql主从复…

解决 sharp: Installation error: unable to verify the first certificate

使用 plasmo 时报错如下&#xff1a; E:\chromeplugins>pnpm create plasmo ../.pnpm-store/v3/tmp/dlx-46852 | 2 ../.pnpm-store/v3/tmp/dlx-46852 | Progress: resolved 2, reused 2, downloaded 0, added 2, done &#x1f7e3; Plasmo v0.83.0 &…

开源云财务软件,财务软件源码,永久免费财务软件

纷析云SAAS云财务软件开源版 包含账套、凭证字、科目、期初、币别、账簿、报表、凭证、结账 技术交流群 扫码添加客服进群 商业版地址 纷析云商业版https://f3.fenxi365.com/ 正式环境&#xff0c;可注册账号直接使用或测试 功能对比 功能模块开源版商业版[技术重构]凭证✔…

微信小程序文本横向无缝滚动

背景&#xff1a; 微信小程序中列表宽度不够长&#xff0c;其中某字段显示不完整&#xff0c;因此要使其自动滚动。 &#xff08;最初看网上很多用定时器实现&#xff0c;但他们的案例中都只是一个横幅、用定时器也无所谓。但是我的需求中是一个上下无限滚动的列表&#xff0c;…

【C++】详解priority_queue(优先级队列)与函数对象

目录 一、priority_queue 的介绍和使用 1.1priority_queue 的介绍 2.2priority_queue 的使用 二、仿函数 2.1什么是仿函数 2.2仿函数的作用 三、函数对象的特点&#xff08;知识点多&#xff09; 3.1分析特点5&#xff08;比较普通函数与函数对象&#xff09; 3.1.1利…

如何快速高效全面的学习自然语言处理

文章目录 &#x1f31f; 如何快速高效全面的学习自然语言处理&#x1f34a; 学习基础知识&#x1f389; 语言学&#x1f389; 统计学和信息论&#x1f389; 机器学习&#x1f389; 计算机科学 &#x1f34a; 学习NLP技术&#x1f389; 语言模型&#x1f389; 词向量&#x1f38…

IK分词器如何修改支持跨版本ES

一、问题描述&#xff1a;IK分词器版本和ES版本不一致&#xff0c;无法找到和自己ES版本匹配的分词器。 IK分词器&#xff0c;提供的插件版本&#xff0c;远赶不上ES的更新版本&#xff0c;在使用过程中&#xff0c;不一定能顺利的找到与自己使用的ES版本相对应。在ES集群中使用…

揭开MyBatis的神秘面纱:掌握动态代理在底层实现中的精髓

一日小区漫步&#xff0c;我问朋友&#xff1a;Mybatis中声明一个interface接口&#xff0c;没有编写任何实现类&#xff0c;Mybatis就能返回接口实例&#xff0c;并调用接口方法返回数据库数据&#xff0c;你知道为什么不&#xff1f; 朋友很是诧异&#xff1a;是啊&#xff…

2023年全球及中国层析系统市场发展趋势分析:未来层析设备市场将持续增长[图]

完整的层析系统主要包含泵、各种阀门、层析柱、各种在位检测器和收集器。层析系统包含层析输液系统和层析柱两个主要部分&#xff0c;层析柱根据结构和内径不同分为手动层析柱、自动轴向压缩层析柱、自动喷胶层析柱等。 层析系统主要部分 资料来源&#xff1a;共研产业咨询&am…

Leetcode—2529.正整数和负整数的最大计数【简单】

2023每日刷题&#xff08;四&#xff09; Leetcode—2529.正整数和负整数的最大计数 遍历法实现代码 int maximumCount(int* nums, int numsSize){int i;int neg 0, pos 0;for(i 0; i < numsSize; i) {if(nums[i] < 0) {neg;}if(nums[i] > 0) {pos;}}return (neg…

【数据结构】线性表(五)跳表及其基本操作(定义、创建、查找、插入、删除)

目录 前言 1. 单链表 跳表&#xff08;Skip List&#xff09; 0. 概念 1. 数据结构 a. 跳表节点结构SkipListNode b. 跳表结构SkipList 2. 辅助函数 a. 初始化节点 b. 初始化跳表 c. 生成随机层数 3. 查找节点 4. 插入节点 5. 删除节点 6. 主函数 代码整合 前言…