力扣---最长有效括号---动态规划,栈

动态规划思路:

最长xxxx的问题,从动态规划的角度去考虑,我们会将 g[i] 定义为以 第 i 位 结尾的小问题。在本道题中,我们将 g[i] 定义为以第 i 位为结尾的最长有效括号子串的长度。从头去遍历每一位,我们会发现只有s[i]为‘ )’才有资格当结尾。那么就分为以下两种情况:第一种情况为...(),那么递推公式为g[i]=g[i-2]+2,第二种情况为...)),...|.......)|),我们将子串分为3部分,其中中间那部分的长度为g[i-1],这个时候如果第i位的加入可以得到更好的答案(也就是s[i-1-g[i-1]]='('),那么递推公式为g[i]=g[i-1]+2+g[i-2-g[i-1]],为什么还要加上g[i-2-g[i-1]]?因为还要加上能和第二部分连接上的第一部分子串。数组初始化即为g[i]=0。

代码:

C++:

class Solution {
public:
    int longestValidParentheses(string s) {
        int res=0;
        int len=s.size();
        vector<int> g(len,0);  //以第 i 位为结尾的最长有效括号子串的长度
        for(int i=1;i<len;i++){
            if(s[i]==')'){//‘)’才可以,分为两种情况,第一种是....(),第二种是....))
                if(s[i-1]=='('){ //第一种情况
                    if(i-2<0){
                        g[i]=2;
                        res=max(res,g[i]);
                    }
                    else{
                        g[i]=g[i-2]+2;
                        res=max(res,g[i]);
                    }
                }
                else{ //第二种情况
                    if(i-g[i-1]-1>=0 && s[i-g[i-1]-1]=='('){
                        if(i-g[i-1]-2>=0){
                            g[i]=g[i-1]+2+g[i-g[i-1]-2];
                            res=max(res,g[i]);
                        }
                        else{
                            g[i]=g[i-1]+2;
                            res=max(res,g[i]);
                        }
                    }
                }
            }
        }
        return res;
    }
};

Python:

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        res=0
        len_s=len(s)
        g=[0]*len_s
        for i in range(1,len_s):
            if s[i]==')':
                if s[i-1]=='(':
                    if i-2<0:
                        g[i]=2
                        res=max(res,g[i])
                    else:
                        g[i]=g[i-2]+2
                        res=max(res,g[i])
                else:
                    if i-g[i-1]-1>=0 and s[i-g[i-1]-1]=='(':
                        if i-g[i-1]-2>=0:
                            g[i]=g[i-1]+2+g[i-g[i-1]-2]
                            res=max(res,g[i])
                        else:
                            g[i]=g[i-1]+2
                            res=max(res,g[i])
        return res

栈思路:

首先,将所有匹配的左括号和右括号的索引全都记录下来(此时不考虑连续),将这些索引记录到一个数组中,然后再进行最长连续索引的判断。

代码:

C++:

class Solution {
public:
    int longestValidParentheses(string s) {
        int len=s.size();
        deque<int> q; //记录左括号下标
        vector<int> res;

        for(int i=0;i<len;i++){
            if(s[i]=='('){
                q.push_back(i);
            }
            else{
                if(!q.empty()){ //记录这一对下标
                    int temp=q.back();
                    q.pop_back();
                    res.push_back(i);
                    res.push_back(temp);
                }
            }
        }
        if(res.empty()){return 0;}
        //对res进行排序,找最长连续子串
        sort(res.begin(),res.end());
        int len_res=res.size();
        int cnt=1;
        int fin=0;
        for(int i=1;i<len_res;i++){
            if(res[i]==res[i-1]+1){
                cnt++;
            }
            else{
                fin=max(fin,cnt);
                cnt=1;
            }
        }
        fin=max(fin,cnt);
        return fin;
    }
};

Python:

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        len_s=len(s)
        q=deque()
        res=[]
        for i in range(len_s):
            if s[i]=='(':
                q.append(i)
            else:
                if q:
                    temp=q[-1]
                    q.pop()
                    res.append(i)
                    res.append(temp)
        if len(res)==0:
            return 0
        res.sort()
        len_res=len(res)
        cnt=1
        fin=0
        for i in range(1,len_res):
            if res[i]==res[i-1]+1:
                cnt+=1
            else:
                fin=max(fin,cnt)
                cnt=1
        fin=max(fin,cnt)
        return fin

注意,对列表的排序代码:(在原列表上直接修改)

res.sort()

同时,因为用到了deque,所以需要库:

from collections import deque

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

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

相关文章

我的创作纪念日——在CSDN的三年

我的创作纪念日——在CSDN的三年 个人简介机缘收获个人成就学习成就墙文章专栏 日常成就憧憬 个人简介 &#x1f3d8;️&#x1f3d8;️个人主页&#xff1a;以山河作礼。 &#x1f396;️&#x1f396;️:Python领域新星创作者&#xff0c;CSDN实力新星认证&#xff0c;CSDN内…

134. 加油站(力扣LeetCode)

文章目录 134. 加油站题目描述暴力枚举&#xff08;超时&#xff09;代码一代码二&#xff08;优化&#xff09; 贪心算法方法一方法二 134. 加油站 题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&…

【机器学习入门 】支持向量机

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 前言 支持向量机(Support Vector Machine) 于1995年发表&#xff0c;由于其优越的性能和广泛的适用性&#xff0c;成为机器学习的主流技术&…

【11】工程化

一、为什么需要模块化 当前端工程到达一定规模后,就会出现下面的问题: 全局变量污染 依赖混乱 上面的问题,共同导致了代码文件难以细分 模块化就是为了解决上面两个问题出现的 模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理 前端模块化标准…

活用 C语言之union的精妙之用

一、union的基本定义 Union的中文叫法又被称为共用体、联合或者联合体。它的定义方式与结构体相同,但意义却与结构体完全不同。下面是union的定义格式: union 共用体名 {成员列表}共用体变量名;它与结构体的定义方式相同,但区别在于共用体中的成员的起始地址都是相同的,…

Android Studio Gradle设置查看全部task

如果你在 Android Studio 的 Gradle 窗口中看不到所有的任务&#xff0c;你可以尝试以下步骤来解决这个问题 android studio 版本&#xff1a; Android Studio Iguana | 2023.2.1 Build #AI-232.10227.8.2321.11479570, built on February 22, 2024 打开 Android Studio 的设置…

【CSP】2020-12-3 带配额的文件系统 100分完整代码 最长的大模拟 使用指针优化数据结构

2020-12-3 带配额的文件系统 最长的大模拟 使用指针优化数据结构 索引2020-12-3 带配额的文件系统 最长的大模拟 使用指针优化数据结构思路遇到的问题(学到的东西)40分stl代码acwing 15/15 csp官网40分代码100分完整代码 索引 历年CSP认证考试真题题解总汇持续更新 2020-12-3…

框架结构模态分析/动力时程分析Matlab有限元编程 【Matlab源码+PPT讲义】|梁单元|地震时程动画|结果后处理|地震弹性时程分析| 隐式动力学

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

&#x1f680; 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范&#xff1a; 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 &#x1f514; 重大变更 工作空间设置中的「数据访问…

【Linux操作系统】命令的运行原理

文章目录 shell命令以及运行原理Linux系列学习目录 shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ &#xff0c;但我们一般用户&#xff0c;不能直接使用kernel。而是通过kernel的“外壳”程序&…

【网站项目】294火车票订票系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Data Interpreter: An LLM Agent For Data Science 论文解读

论文地址&#xff1a;https://arxiv.org/abs/2402.18679 Github&#xff1a;MetaGPT: The Multi-Agent Framework 数据解释器&#xff08;Data Interpreter&#xff09;是一个基于大型语言模型&#xff08;LLM&#xff09;的代理&#xff0c;专门为解决数据科学问题而设计。它…

主干网络篇 | YOLOv8更换主干网络之MobileNetV3

前言:Hello大家好,我是小哥谈。MobileNetV3是一种轻量级的卷积神经网络架构,用于图像分类和目标检测任务。它是MobileNet系列的第三个版本,旨在在保持高准确性的同时减少模型的计算量和参数数量。MobileNetV3引入了一些新的设计思想和技术,以提高模型的性能。其中一项重要…

抖音用户主页如何打开词令抖音小程序?

抖音用户主页如何打开词令抖音小程序&#xff1f; 1、打开抖音主页&#xff0c;点击右上角的「搜索」&#xff1b; 2、使用抖音搜索找到小程序名称&#xff1a;词令的用户&#xff0c;并点击头像名称进入&#xff1b; 3、进入词令抖音用户主页&#xff0c;并到抖音小程序的图标…

Tensorflow 2.0 常见函数用法(一)

文章目录 0. 基础用法1. tf.cast2. tf.keras.layers.Dense3. tf.variable_scope4. tf.squeeze5. tf.math.multiply 0. 基础用法 Tensorflow 的用法不定期更新遇到的一些用法&#xff0c;之前已经包含了基础用法参考这里 &#xff0c;具体包含如下图的方法&#xff1a; 本文介…

Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 解决跨域问题方案 1.Spring Boot 中解决跨域 1.1 通过注解跨域 1.2 通…

JavaScript高级(十)----JavaScript中的类【重述原型链】!

类 在JavaScript其实本来没有类的概念&#xff0c;哪怕是ES5以后的class&#xff0c;严格意义上来说也只是构造函数的语法糖&#xff0c;之所以喜欢称之为类&#xff0c;因为JavaScript也可以面向对象开发。 类的声明 class Person {}function Person1() {}// 上面两种写法本…

简单了解JMM

什么是JMM 对于不同的硬件和操作系统&#xff0c;有着自己的底层内存模型&#xff0c;可能导致Java程序在一些的平台可以正确并发&#xff0c;而在另一些平台出现并发错误&#xff0c;JMM是Java内存模型&#xff0c;是语言级别的内存模型&#xff0c;用于屏蔽掉各种硬件和操作…

Activiti7学习大纲及环境-Activiti7从入门到专家(2)

学习大纲 入门系列 开发环境及源码编译流程设计器核心API简单流程示例启动与结束事件边界事件中间事件用户任务手动任务接受任务服务任务脚本任务业务规则任务排他网关并行网关包容网关事件网关子流程调用活动泳池泳道执行监听器任务监听器全局监听器真实业务流程 进阶系列 …

蓝桥杯真题讲解:网络稳定性(Kruskal重构树+LCA)

蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;网络稳定性&#xff08;Kruskal重构树LCA&#xff09; 二、正解代码 //kruskal重构树 lca #include<bits/stdc.h>…