算法-动态规划-最长有效括号

这篇具有很好参考价值的文章主要介绍了算法-动态规划-最长有效括号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

32. 最长有效括号

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

示例: 

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

思路分析

注意有效括号通常有两种形式:

重叠形式:((...xx...))

并行形式:(...xx....)(...xx....)

dp[i]表示跟第i个字符组成的有效子串长度

dp[0]组不成有效串,为0

1,若"(" dp[i]=0 截止当前字符,无法组成有效子串,

2,若")" 分情况查看前面字符:

   2.1,若前面字符是"(":

dp[i-2]+2

dp[i-2]前i-2个串的有效子串长度:dp[i-2]加上当前有效的"()"

   2.2,若前面字符是")" :

  可能组成 "((xxx))" 则判断s[i-1-dp[i-1]]的字符是不是预期中的"(",若是的话则当前 dp[i-1]+2 。注意,也可能是这样的:"(xxx)((xxx))",还要加上可能存在的红色部分。

dp[i]=dp[i-2-dp[i-1]]+dp[i-1]+2 

注意!边界情况的判断! 文章来源地址https://www.toymoban.com/news/detail-502544.html

代码

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        n=len(s)
        if n<=1:
            return 0
        dp=[0]*n
        for i in range(1,n):
            if s[i]=="(":
                dp[i]=0
            else:
                #a==")"
                if s[i-1]=="(":
                    dp[i]=dp[i-2]+2 if i>=2 else 2
                if s[i-1]==")":
                    print("i=%s"%(i))
                    dp[i]=dp[i-2-dp[i-1]]+dp[i-1]+2 if i-1-dp[i-1]>=0 and s[i-1-dp[i-1]]=="(" else 0
                    #dp[i-2-dp[i-1]]+dp[i-1]+2 类似于(s1)((s2)) s2长度+s1长度
                
            print("dp[%i]=%s"%(i,dp[i]))
        return max(dp)
                       

到了这里,关于算法-动态规划-最长有效括号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法Hot100系列】最长有效括号

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月02日
    浏览(43)
  • 有效的括号字符串(力扣)动态规划、贪心 JAVA

    给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是有效字符串返回true 。 有效字符串符合如下规则: 任何左括号 ‘(’ 必须有相应的右括号 ‘)’。 任何右括号 ‘)’ 必须有相应的左括号 ‘(’

    2024年02月14日
    浏览(38)
  • Leetcode | 有效的括号、最长有效括号

    给定一个只包括  \\\'(\\\' , \\\')\\\' , \\\'{\\\' , \\\'}\\\' , \\\'[\\\' , \\\']\\\'  的字符串  s  ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 示例 2: 示例 3: 提示: 1

    2024年02月14日
    浏览(43)
  • 动态规划算法 | 最长递增子序列

    通过查阅相关资料 发现动态规划问题一般就是求解最值问题 。这种方法在解决一些问题时应用比较多,比如求最长递增子序列等。 有部分人认为动态规划的核心就是:穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。 首先,笔者认为动态规划中

    2024年02月06日
    浏览(54)
  • 【算法-动态规划】最长公共子序列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年01月23日
    浏览(46)
  • 算法:动态规划——最长公共子序列

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的

    2023年04月27日
    浏览(58)
  • 算法 矩阵最长递增路径-(递归回溯+动态规划)

    牛客网: BM61 求矩阵的最长递增路径 解题思路: 1. 遍历二维矩阵每个位置,max求出所有位置分别为终点时的最长路径 2. 求某个位置为终点的最长路径时,使用动态规划dp对已经计算出的位置进行记录 3. 处理某个位置的最长路径时,如果dp[i][j]位置已有值,则直接返回即可,否则

    2024年02月07日
    浏览(42)
  • 【马拉车算法/动态规划】最长回文字串

    常用有3种算法:中心扩展法、动态规划和Manacher算法 解释: 从中心向外扩展。 分为两种情况:第一种当回文串长度为奇数的情况;第二种当回文串长度为偶数的情况。 左右同时向外扩展,当左右不相同时停止扩展,记录最长回文串长度及起始位置。 首先初始化一个维度为

    2024年02月11日
    浏览(34)
  • 【动态规划】最长公共子序列——算法设计与分析

    子序列是给定序列中在任意位置去掉任意多个字符后得到的结果。例如: 给定序列 X X X : X : A B C B D A B X:ABCBDAB X : A BCB D A B X X X 的子序列: X 1 : A B C B D A B X_1:ABCBDAB X 1 ​ : A BCB D A B X 2 : A B C B X_2:ABCB X 2 ​ : A BCB X 3 : A C B B X_3:ACBB X 3 ​ : A CBB 给定两个序列

    2024年02月05日
    浏览(54)
  • (Java) 算法——动态规划 最长公共子序列 图解

    遇到了用动态规划来求解最长公共子序列问题,算法这块儿比较薄弱,便想着在网上找现成的思路和代码,也算拾人牙慧,但有一点没想到,都已经22年了,关于LCS问题网上给出的答案如此一言难尽……,只有零散几篇对于 新手 来说比较友好,但也仅仅这样,好在自己花了点

    2023年04月08日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包