动态规划----10.最长有效括号

leetcode-hot100-15动态规划 假设你正在爬楼梯。需要 阶你才能到达楼顶。每次你可以爬 或 个台阶。你有多少种不同的方法可以爬到楼顶呢? 方法一:c 状态标识:爬到第i层楼梯时,有多少种方法。 状态转移方程:dp[i] = dp[i-1] + dp[i-2],表示从走一步和走两步的方式。 初始化:dp[1] = 1 , dp[2] = 2。 返回值:dp[n],即走到第n层可以有多少种爬法。 方法一:js 方法一:java 118. 杨辉三角 给定一个非负整数 *,*生成「杨辉三角」的前 行。在**「杨辉三角」**中,每 阅读详情

32. 最长有效括号 - 力扣(LeetCode)

/**

        validLen[]:有效长度,validLen[i]代表,以下标i结尾时连续有效括号长度

        初始时全部默认初始化为0,且i = 0时,必定不存在有效括号,从1开始

       

    动态规划:

        情况一:()()

            以下标1结尾:validLen[1]--> if(s[1] == ')') --> if(s[1 - 1] == '(') --> validLen[1] == 2

            以下标2结尾:validLen[2]--> if(s[2] == ')') --> if(s[2 - 1] == '(') --> validLen[2] == 2 (长度为3最多就一个括号)

            以下标3结尾:validLen[3]--> if(s[3] == ')') --> if(s[3 - 1] == '(') --> validLen[3] == 2 + validLen[3 - 2]

            .......

            以下标i结尾:validLen[i]--> if(s[i] == ')') --> if(s[i - 1] == '(') --> validLen[i] == 2 + validLen[i - 2]

            即,当前[i-1,i]-->[(,)]可组成一个有效括号长度为2,还要加上以i - 2结尾的有效括号长度(注,当i >= 3时才成立,只有长度为4时才有可能存在两对及以上括号)

        情况二:(())

            以下标i结尾:validLen[i]--> if(s[i] == ')') --> if(s[i - 1] == ')') --> if(s[i - validLen[i - 1] - 1] == '('])

            --> validLen[i] = 2 + validLen[i - 1] + validLen[i - validLen[i - 1] - 2]

            即最外层的(2) + 中间嵌套的(validLen[i - 1]) + 最外层左边有可能的(validLen[i - validLen[i - 1] - 2])

   

    栈:

        定义一个布尔数组Marks记录括号是否合法,与一个栈

        遍历字符串,如果遇到左括号则压入栈中(下标),如果遇到右括号则弹出元素

        将弹出的元素与当前遍历到的元素对应下标在Marks设置为true,若无元素可弹出,则将Marks对应位置设置为false

        遍历布尔数组,最长连续的true即为最长连续有效括号

*/

class Solution {
    /**
        validLen[]:有效长度,validLen[i]代表,以下标i结尾时连续有效括号长度
        初始时全部默认初始化为0,且i = 0时,必定不存在有效括号,从1开始
        
    动态规划:
        情况一:()()
            以下标1结尾:validLen[1]--> if(s[1] == ')') --> if(s[1 - 1] == '(') --> validLen[1] == 2
            以下标2结尾:validLen[2]--> if(s[2] == ')') --> if(s[2 - 1] == '(') --> validLen[2] == 2 (长度为3最多就一个括号)
            以下标3结尾:validLen[3]--> if(s[3] == ')') --> if(s[3 - 1] == '(') --> validLen[3] == 2 + validLen[3 - 2]
            .......
            以下标i结尾:validLen[i]--> if(s[i] == ')') --> if(s[i - 1] == '(') --> validLen[i] == 2 + validLen[i - 2]
            即,当前[i-1,i]-->[(,)]可组成一个有效括号长度为2,还要加上以i - 2结尾的有效括号长度(注,当i >= 3时才成立,只有长度为4时才有可能存在两对及以上括号)

        情况二:(())
            以下标i结尾:validLen[i]--> if(s[i] == ')') --> if(s[i - 1] == ')') --> if(s[i - validLen[i - 1] - 1] == '(']) 
            --> validLen[i] = 2 + validLen[i - 1] + validLen[i - validLen[i - 1] - 2] 
            即最外层的(2) + 中间嵌套的(validLen[i - 1]) + 最外层左边有可能的(validLen[i - validLen[i - 1] - 2])
    
    栈:
        定义一个布尔数组Marks记录括号是否合法,与一个栈
        遍历字符串,如果遇到左括号则压入栈中(下标),如果遇到右括号则弹出元素
        将弹出的元素与当前遍历到的元素对应下标在Marks设置为true,若无元素可弹出,则将Marks对应位置设置为false
        遍历布尔数组,最长连续的true即为最长连续有效括号
    */
    public int longestValidParentheses(String s) { 
        //动态规划
        //return DP(s);

        //栈
        return byStack(s);
    }

    //栈
    private int byStack(String s) {
        //记录括号是否合法
        boolean marks[] = new boolean[s.length()];

        //双端队列模拟栈
        Deque<Integer> stack = new ArrayDeque<>();

        char c[] = s.toCharArray();
        for(int i = 0; i < c.length; i++) {
            //左括号入栈
            if(c[i] == '(') { 
                stack.push(i);
            } 
            
            //右括号弹出栈顶元素
            else {
                if(!stack.isEmpty()) { //marks默认初始化为false,为空不用处理
                    int index = stack.pop();
                    marks[index] = true;
                    marks[i] = true;
                }
            }
        }

        //遍历marks,得出最长连续括号
        int maxLen = 0;
        int temp = 0;
        for(int i = 0; i < marks.length; i++) {
            if(marks[i]) {
                temp++;
                maxLen = Math.max(maxLen,temp);
            } else {
                temp = 0;
            }
        }

        return maxLen;
    }

    //动态规划
    private int DP(String s) {
        //默认初始化全为0
        int validLen[] = new int[s.length()];

        //遍历过程中迭代最长有效值
        int maxLen = 0;

        //以0结尾不可能存在有效括号,从1开始即可
        for(int i = 1; i < s.length(); i++) {
            if(s.charAt(i) == ')') {
                if(s.charAt(i - 1) == '(') {
                    if(i >= 3) { //长度大于等于4才可能出现两对及以上有效括号
                        validLen[i] = 2 + validLen[i - 2];
                    } else { //长度小于4,最多一对有效括号
                        validLen[i] = 2;
                    }
                } 
                
                //情况二 嵌套
                else if(s.charAt(i - 1) == ')') {
                    //中间嵌套了n个括号,与最外层匹配的只能在i - validLen[i - 1] - 1处;validLen[i - 1]代表嵌套的n个括号的长度
                    if(i - validLen[i - 1] - 1 >= 0 && s.charAt(i - validLen[i - 1] - 1)== '(') {
                        //外层 + 中间嵌套的
                        validLen[i] = 2 + validLen[i - 1];

                        //若整体左侧还有有效括号,还需要加上左侧的 例:()()((()))
                        if(i - validLen[i - 1] - 2 >= 0) {
                            validLen[i] += validLen[i - validLen[i - 1] - 2];//i - validLen[i - 1] - 1(嵌套结构整体) 再 - 1,嵌套结构整体左侧
                        }
                    }
                }
            }
            maxLen = Math.max(maxLen,validLen[i]);
        }

        return maxLen;
    }
}

【华为OD技术面试手撕真题】42、最长有效括号 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(0ms) 【华为OD技术面试手撕真题】42、最长有效括号 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)华为od机试真题,华为OD技术二面,华为od机考,华为od手撕真题,华为od技术二面,华为od机试,华为OD机试的高频手撕代码题,华为od八股文 阅读详情

相关推荐

数据库1:数据库创建与管理(头歌云课)

在 Windows 系统中,可以直接通过 SQLServer 的应用程序连接数据库,不过很多时候在生产环境下,我们需要通过命令行来连接数据库。两个数据库,数据库名分别为 TestDb 和 MyDb 的数据库,注意先后顺序。为了完成本关任务,你需要掌握:1.如何在 Linux 系统中连接 SQLServer 数据库,2.如何创建数据库。连接的数据库是本地数据库,用户名是 sa ,密码是 '

weixin_60530224的博客 2315

最长有效括号-动态规划

题目 给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 输入:s = “)()())” 输出:4 动态规划 dp[i]表示以s[i]为结尾的最长有效括号 s[i] =’('时,dp[i]必然为0 s[i] = ’ ) ’ 时,如果s[i-1] = ’ ( ‘,则dp[i] = dp[i-2] + 2 如果s[i-1]= ‘)’,且s[i-1-dp[i-1]] =’'则dp[i] = dp[i-1] + 2 + dp[i-2-dp[i-.

qq_42692908的博客 590

AI 推理与服务(AI Inference and Serving)

AI 推理和服务是现代分布式系统中的重要组成部分。通过合理应用 AI 推理和服务的最佳实践,可以显著提高系统的智能性和用户体验。本章介绍了 AI 推理和服务的核心概念、最佳实践以及在分布式系统中的应用,希望这些内容能帮助您构建更智能、更高效的分布式系统。

蜗牛沐雨 1383

LeetCode 最长有效括号(动态规划,超详细)

LeetCode 最长有效括号 动态规划

weixin_54453878的博客 280

Springboot + vue 实现导出word

Springboot + vue 实现导出word 后端代码 使用word先创建好已知的模板 使用word工具另存为.xml格式的文件 使用freemarker ftl模板 将修改后的xml文件复制到开发工具中,将文件后缀修改为ftl文件,并且将里面的动态值使用${}包裹例如:${zyjn} word工具类 /*** * * Project Name:maventest * <p>生成word工具类<br> * * @ClassName: WordUtil *

qq_45542373的博客 2895

绝缘检测原理和绝缘电阻计算方法

绝缘检测的目的就是计算绝缘电阻,当绝缘电阻低于某个阈值,则很可能会造成电池短路、漏电,威胁人员安全

m0_56208280的博客 4万+

动态规划—最长有效括号(leetcode32)

题目描述 给你一个只包含 '('和 ')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 1: 输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()" 示例 2: 输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()" 示例 3: 输入:s = "" 输出:0 提示: 0 <= s.length <= 3 * 104 s[i] 为 '(' 或 ')' 问题分析 思路和算法 我们定义 表示以下标 i 字符结...

guoxinian的专栏 3851

【Q1/论文复现】:利用 CHARLS 数据库考察抗高血压药物依从性和认知衰退

摘要: 北京大学团队基于CHARLS数据(2011-2018)的纵向研究发现,抗高血压药物高依从性能显著延缓中国45岁及以上社区中老年人的认知衰退。研究表明,坚持服药者7年内全局认知衰退速度降低0.014SD/年,记忆功能衰退减缓0.023SD/年,效果接近正常血压人群水平。研究还提示社会经济地位(SES)可能通过影响用药依从性间接调控认知衰老进程。该成果为高血压管理对认知保护提供了人群级证据,发表于《BMC Medicine》(DOI:10.1186/s12916-025-03949-8)。

dingdianbangni的博客 809

LeetCode32. 最长有效括号(动态规划、滑动窗口)

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2: 输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 有两种解答方式。 第一种,滑动窗口。 对字符串进行括号闭合验证,记录最值。 然后再进行一次对称变换,进行验证,两次取最值,就是字符串的最长...

明觉 1138

15、分布式查询处理详解

本博文深入探讨了分布式环境下的查询处理与优化技术。从查询处理的基本概念出发,分析了在分布式系统中执行查询所面临的额外挑战,并通过实例比较了不同的执行策略。文章详细介绍了查询优化的组成要素,包括搜索空间、成本模型和搜索策略,同时涵盖了查询处理的多个层次以及数据本地化的核心方法。此外,还讨论了连接排序优化、分布式成本模型以及多种查询优化方法,如静态优化、动态优化和混合优化。最后,提出了自适应查询处理的概念,旨在提高分布式查询的灵活性和效率。通过综合应用这些技术,可以有效提升分布式数据库的查询性能,降低通信和计算

gan8painter的博客 73

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 446

LeetCode-32.最长有效括号(考察点:栈/动态规划)

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()" 示例 2:输入: ")()())" 输出: 4 解释: 最长有效括号子串为 "()()" 解法1:栈类似于之前LeetCode20-有效的括号(该题的解法不再详述,大致思路:遇左括号入栈,遇右括号,先判断栈是否为空,若栈为空,则直接ret...

weixin_38823568的博客 1万+

cannot import name ‘BUFSIZE‘ from ‘numpy‘ 解决方案

本文主要介绍了cannot import name ‘BUFSIZE’ from ‘numpy’ 解决方案,希望能对使用numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 22万+

刷题记录 HOT100 动态规划-10:32. 最长有效括号

难度:困难给你一个只包含'('和')'的字符串,找出最长有效(格式正确且连续)括号子串的长度。s = "(()"2最长有效括号子串是 "()"4最长有效括号子串是 "()()"s = ""0'('')'

weixin_44610684的博客 341

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

动态规划81-90

【代码】动态规划81-90。

Lcberg的博客 22

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【JAVA架构师成长之路】【面试题】第6集:LeetCode高频算法面试题精讲(第五期共10道)

按层遍历二叉树,奇数层从左到右,偶数层从右到左。:实现字符串到整数的转换,处理溢出和非法输入。:判断能否完成所有课程学习(依赖关系无环)。:计算执行所有任务的最短时间(含冷却间隔)。:找到字符串中包含目标所有字符的最短子串。:求字符串中最长的有效括号子串长度。:判断二叉树是否为有效的二叉搜索树。:求两个字符串的最长公共子序列长度。:在旋转后的有序数组中搜索目标值。:求凑成总金额所需的最少硬币数。

因为热爱,所以付出 1194

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

11.26-12.05力扣栈刷题

当元素 x 入栈时,令 freq[x]+1,然后将 x 放入 group[freq[x]] 中,更新 maxFreq=max(maxFreq,freq[x])。))”,可以推出:如果 s[i−dp[i−1]−1]=‘(’,那么dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2。如果看到一个数字 S [i],则表示在解析 S [0],S [1],...,S [i-1] 之后解码字符串的大小将是 size / Integer(S[i])。()”,可以推出:dp[i]=dp[i−2]+2。

sprintzer的博客 610

电视盒子播放器选型:TVBoxOSC能在老盒子上放出4K片源吗

老电视盒子插上装满4K MKV的U盘,自带播放器提示"格式不支持"。TVBoxOSC是一个开源电视盒子播放器,基于TVBoxOS生态:在盒子上播放本地影片,同时可加载直播源。 ## 瓶颈在哪:电视盒子播放卡顿的原因 盒子自带的播放器多是"通用精简版":解码模块被裁剪,HEVC、AV1这类新编码默认不带。好比老款车的ECU不认识新油品,能点火,跑起来就肉,越跑越卡。 另一层是硬件:4K高码率影

gitblog_00092的博客 461

算法题打卡-二刷动态规划

去年写了个版本,已经完全忘记思路了,看一眼题解的dp数组,就开始自己写。回看去年的版本,发现定义的dp数组完全不同,不变的是,只要定义清晰,就能写出来。 理解题目对于我的不变量和变量,让我觉得很有趣。我忽然注意到英文的problem和solve the problem,对应于中文的题目和解题,我觉得差别还挺大的。 我们现在常常用刷题代替解题,「刷」会让我联想到,题目有一个库,刷的过程是将这个库全部扫一遍,装进脑袋。从去年到今年的两次解题来看,我装进脑袋的肯定不是这个库,那么究竟是什么?也许是一种方法、思维方

weixin_53915654的博客 214

力扣hot100—系列3-动态规划

在纸上画出dp数组的变化过程。模板记忆:零钱兑换、分割等和子集。最长递增子序列。爬楼梯、打家劫舍。重点在于理解dp[i]为什么依赖于dp[i-1]。建议按上面的顺序从爬楼梯开始,每道题手动推导一下n12345n12345的情况,发现规律!

qq_60957452的博客 736

【动态规划算法题记录】最长/最大 问题汇总 (leetcode)

是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。首先,我们定义一个dp数组,表示以第i个元素结尾的字符串的最长有效括号的长度。每次计算的时候我们都要记录更大的连续和,最后得到的就是全局最优的最大连续和。的字符串,找出最长有效(格式正确且连续)括号子串的长度。的最长公共子数组的长度。

weixin_43627638的博客 1284

leetcode练习 最长有效括号

条件为:遍历字符串,当字符为"("时,入栈,当为")"时判断栈是否为空,如果为空的话,说明这个位置不匹配,该位置的长度一定为0,dp[i+1]=0。如果栈不为空的话,那么将栈顶出栈,现在这个右括号的长度为栈顶元素的dp[j]+i-j+1(但是一般来说,dp[j]应该都是0吧,中间是断的不可能再加)的字符串,找出最长有效(格式正确且连续)括号。未能找到别的解决办法,遂改为+1.最长有效括号子串是 "()()"最长有效括号子串是 "()"

m0_74897394的博客 223

32. 最长有效括号

我们考虑如果倒数第二个 ‘)’ 是一个有效子字符串的一部分(记作 subs),对于最后一个 ‘)’ ,如果它是一个更长子字符串的一部分,那么它一定有一个对应的 ‘(’ ,且它的位置在倒数第二个 ‘)’ 所在的有效子字符串的前面(也就是 subs的前面)。第二种情况同理,需要把有效子串 “(subs)” 之前的有效子串的长度也加上,也就是再加上 dp[i−dp[i−1]−2],如果i−dp[i−1]−2比0小,说明遇到了刚才的情况,已经到数组边界了,就没有之前的有效子串了,因此要用0+2。

gyjllll的博客 327

【Hot100】LeetCode—32. 最长有效括号

32. 最长有效括号

weixin_44382896的博客 325

动态规划总结

动态规划(Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其子问题,再根据子问题的解以得出原问题的解。

gl490402850的博客 2089
上一篇: 动态规划----9.分割等和子集
下一篇: 二维动态规划----1.不同路径
码破苍穹ovo
博客等级 码龄2年 377粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值