动态规划 Leetcode 32 Longest Valid Parentheses(最长有效括号)

2023-11-02

题目

给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。

示例 1:

输入: "(()"
输出: 2
解释: 最长有效括号子串为"()"

示例 2:

输入: ")()())"
输出: 4
解释: 最长有效括号子串为"()()"

链接(中文版):https://leetcode-cn.com/problems/longest-valid-parentheses

链接(英文版):https://leetcode.com/problems/longest-valid-parentheses

分析

有其他解法,这里只用DP算法。

用一个和s等长的数组V记录结果,其中V[i]表示以第i个字符为结尾的最长有效括号长度。

当s[i]==‘(’时,由于以左括号为结尾是无效的,因此V[i]是0。

当s[i]==')'时,分两种情况:

  1. 如果s[i-1]==‘(’,则和s[i]配对,那么以s[i]为结尾的最大有效长度就是2加上以s[i-2]为结尾的最大有效长度(注意越界判断)。
  2. 如果s[i-1]==‘)’,则需要再次往前找左括号,以便和s[i]配对,那么往前多少呢,如果以s[i-1]为结尾的最大有效长度是4,即V[i-1]=4,则说明我们应该往前跳过4个字符,如果4个字符之前的字符s[i-1-4]不是左括号,则s[i]这个右括号是没法配对的,因此V[i]=0;如果s[i-1-4]左括号,则和s[i]成功配对,此时的最长有效长度就是4+2+V[i-1-4-1](注意越界判断)。最后加的V[i-1-4-1]是以s[i-1-4-1]为结尾的最大有效长度,现在要和s[i-1-4]到s[i]这一段连到一起。

举例说明

输入s是"(())())",为了取消越界判断,我们在s前边加一个任意字符,比如#。即输入是"#(())())",长度是8。

初始化一个等长(长度是8)的全零列表V。以下每一步都要记录max_len,最后返回即可。

  1. 从脚标2开始判断,因为脚标0是#,不管脚标1是什么括号,以它为结尾的长度是1,因此V[1]=0;脚标2是(,以左括号为结尾,是无效的,因此V[2]=0还是全零,即V还是全零。
  2. 脚标3是),此时脚标3-1是(,可以配对,长度是2+V[3-2]=2,此时V=[0, 0, 0, 2, 0, 0, 0, 0]。
  3. 脚标4是),此时脚标4-1是),不可以配对,由于V[4-1]=2,则往前跳2个字符,s[4-1-2]是左括号,可以配对,最大有效长度是2+V[4-1]+V[4-1-2]=2+2+0=4,此时V=[0, 0, 0, 2, 4, 0, 0, 0]。
  4. 脚标5是(,V不变,还是[0, 0, 0, 2, 4, 0, 0, 0]
  5. 脚标6是),此时脚标6-1是(,可以配对,长度是2+V[6-2]=6,此时V=[0, 0, 0, 2, 4, 0, 6, 0]。
  6. 脚标7是),此时脚标7-1是),不可以配对,由于V[7-1]=6,则往前跳6个字符,是#,不可以配对,因此V[7]=0,V不变。

代码

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        s = '#' + s
        V = [0] * len(s)
        ret = 0 #最终的最大有效长度
        for i in range(2, len(s)): #从2开始遍历,因为前边加了#
            if s[i] == ')': #只需要处理是右括号的情况,因为以左括号为结尾是无效的序列
                if s[i-1] == '(': #前边是左括号,可以配对
                    V[i] = V[i-2] + 2
                else: #前边是右括号,只能再往前寻找左括号
                    idx = i - 1 - V[i-1] #再次往前跳过V[i-1]个字符
                    if s[idx] == '(':
                        V[i] = V[i-1] + 2 + V[idx-1]
                if ret < V[i]:
                    ret = V[i]
        # print(V)
        # print(ret)
        return ret

总结

提交结果,运行时间统计得不是很准确:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划 Leetcode 32 Longest Valid Parentheses(最长有效括号) 的相关文章

随机推荐

  • Java http请求工具类

    近期使用json请求很多 数据交互格式统一 方便数据转化 但是过时的工具类在后台之间请求时 发现接收到并不是标准的JSON 请求头也有问题 造成很大的困扰 所以整理了一个标准的工具类 import org apache http NameV
  • c语言中八进制输出的格式说明符,C 的输入&输出格式说明符讲解

    C的输入 输出格式说明符讲解 方便你了解C的输入与输出格式的写法 d整型输出 ld长整型输出 o以八进制数形式输出整数 x以十六进制数形式输出整数 或输出字符串的地址 u以十进制数输出unsigned型数据 无符号数 注意 d与 u有无符号
  • win服务器上的虚拟机反应慢,高手解读Win10系统打开vmware特别慢的具体方法

    大家在用win10系统的过程中 各位难免会遇到Win10系统打开vmware特别慢的问题 Win10系统打开vmware特别慢这样的情况还真的把很多电脑高手都为难住了 别着急 我们自己就可以处理掉Win10系统打开vmware特别慢的问题
  • 【毕业季·进击的技术er】 我 能

    你陪我步入蝉夏 越过城市喧嚣 歌声还在游走 你榴花般的双眸 不见你的温柔 丢失花间欢笑 岁月无法停留流云 的等候 在纸短情长里 我们迎来了毕业季 这是告别 也是迈向新起点的开始 本文我从一个大三在校生的角度来讲讲我和编程的那些事 希望技术社
  • Android 系统865虚拟化集成无源码apk示例

    一 环境 高通865虚拟化Android 10 版本 二 具体修改的文件 以集成OppoAnonymousId apk为例 1 新建OppoAnonymousId目录 将apk放到该目录 vendor qcom proprietary pr
  • g2o编译错误

    ORBSLAM2 with pointcloud map g2o with orbslam2 g2o types slam2d edge se2 pointxy bearing cpp 51 39 error cannot convert
  • uniapp uni.setClipboardData成功默认提示

    uni setClipboardData data hello uniapp success function 重点 做笔记 在success中加入uni hideToast 可以解决 uni hideToast 以下就可自定义操作了 fa
  • SpringBoot(八)拦截器Interceptor

    上篇介绍了Filter过滤器的使用 提起过滤器 就不得不再提起另外一个叫做拦截器的东西 两者的作用类似 都可以实现拦截请求的作用 但其实两者有着非常大的区别 本篇 我们就来学习下拦截器的使用 如果你是新手 且没看过我之前的一系列Spring
  • Ubuntu系统使用光盘作为apt-get源

    1 将系统光盘插入光驱 接入系统 并挂载 mount dev sr0 mnt 2 修改apt get源 将光驱挂着的目录加入源 vim etc apt sources list 在首行加入 deb file mnt trusty main
  • 【Linux服务器】 .bashrc设置永久环境变量后不起作用的问题

    在使用vi打开 bashrc文件以后设置环境变量 vim bashrc export PATH PATH home uusama mysql bin 然而发现设置了以后不起作用 这时候可以在终端界面使用export命令查看当前所有的PATH
  • 基于Aidlux的自动驾驶智能预警方案

    forewarning py为智能预警代码 运行后视频结果如下所示 基于Aidlux的自动驾驶智能预警方案 YOLOP导出onnx模型 执行命令 python3 export onxx py height 640 width 640 执行完
  • 问题 E: 括号的最大嵌套深度

    题目描述 如果字符串满足以下条件之一 则可以称之为 有效括号字符串 valid parentheses string 可以简写为 VPS 字符串是一个空字符串 或者是一个不为 或 的单字符 字符串可以写为 AB A 与 B 字符串连接 其中
  • 机器学习课后习题 --- 逻辑回归

    一 单选题 1 一监狱人脸识别准入系统用来识别待进入人员的身份 此系统一共包括识别4种不同的人员 狱警 小偷 送餐员 其他 下面哪种学习方法最适合此种应用需求 A 二分类问题 B 多分类问题 C 回归问题 D 聚类问题 2 以下关于分类问题
  • webpack5基本教程-1

    基本使用 Webpack 是一个静态资源打包工具 它会以一个或多个文件作为打包的入口 将我们整个项目所有文件编译组合成一个或多个文件输出出去 输出的文件就是编译好的文件 就可以在浏览器段运行了 我们将 Webpack 输出的文件叫做 bun
  • nginx 超时配置说明

    keepalive timeout 默认75s 通常keepalive timeout应该比client body timeout大 如果值为0 则响应头Connection close Syntax keepalive timeout t
  • android log缓冲区大小,科普:开发者模式日志记录缓冲区到底怎样设置

    概念 志缓冲区是小型的 用于短期存储将写入到磁盘上的重做日志的变更向量的临时区域 变更向量 是应用于某些对象的修改 执行DML语句会生成应用于数据的变更向量 有了重做日志 数据库就可以确保数据永不丢失 每当数据块发生更改时 都会将应用于块的
  • 微信开发时, 如何进行服务器验证及接收回复信息呢? 分享原生PHP代码如下:

    if isset GET echostr signature GET signature timestamp GET timestamp nonce GET nonce 验证时会传递这个信息 echostr GET echostr toke
  • STM32_超声波测距

    超声波测距 超声波测距原理 超声波模块说明书 超声波注意事项 HMI串口屏 代码解析 测距结果 超声波测距原理 利用声音测距 声音在空气中的速度是340m s 15 当声音传播时 若遇到障碍物时 就会被反弹回来 通过计时反弹回来的时间就可以
  • 天池大赛:街景字符编码识别——Part5:模型集成

    街景字符编码识别 更新流程 Task01 赛题理解 Task02 数据读取与数据扩增 Task03 字符识别模型 Task04 模型训练与验证 Task05 模型集成 老夜店鸟 炸 炸辽 给朋友看要破壳的鸡蛋 比赛链接 Part5 模型集成
  • 动态规划 Leetcode 32 Longest Valid Parentheses(最长有效括号)

    题目 给定一个只包含 和 的字符串 找出最长的包含有效括号的子串的长度 示例 1 输入 输出 2 解释 最长有效括号子串为 示例 2 输入 输出 4 解释 最长有效括号子串为 链接 中文版 https leetcode cn com pro