Python描述 LeetCode 32. 最长有效括号

Posted 亓官劼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python描述 LeetCode 32. 最长有效括号相关的知识,希望对你有一定的参考价值。

Python描述 LeetCode 32. 最长有效括号

  大家好,我是亓官劼(qí guān jié ),在【亓官劼】公众号、CSDN、GitHub、B站等平台分享一些技术博文,主要包括前端开发、python后端开发、小程序开发、数据结构与算法、docker、Linux常用运维、NLP等相关技术博文,时光荏苒,未来可期,加油~

  如果喜欢博主的文章可以关注博主的个人公众号【亓官劼】(qí guān jié),里面的文章更全更新更快。如果有需要找博主的话可以在公众号后台留言,我会尽快回复消息.


本文原创为【亓官劼】(qí guān jié ),请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 全部文章请关注微信公众号【亓官劼】。

题目

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

示例 1:

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

示例 2:

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

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i]'('')'

解题思路

动态规划。dp[i]表示以s[i]结尾的最长有效括号长度

  1. s[i] = '(',以(结尾一定不能构成有效括号,为0
  2. s[i] = ')',此时有两种情况:
    1. s[i-1] = '(':此时s[i]和s[i-1]刚好可以构成一个有效括号,那么可以和前面以s[i-2]结尾的最长序列连起来,即dp[i] = dp[i-2]+2
    2. s[i-1] = ')':此时s[i-1]的)可能也前面构成一个最长有效序列(()....()),那么这个有效序列开始的位置即i - dp[i-2]
      1. 如果此序列开始的前一个位置为'('的话,那么可以和当前的)构成一个有效序列,同时还可以和dp[i - dp[i-2]-2]连起来
      2. 如果前一个位置是),则不能构成有效括号序列

Python描述

class Solution:
    def longestValidParentheses(self, s: str) -> int:
        n = len(s)
        if n == 0:
            return 0
        # dp[i]表示以s[i]结尾的最大有效括号长度
        dp = [0 for _ in range(n)]
        for i in range(1,n):
            if s[i] == ')':
                if s[i-1] == '(':
                    # 与前一个(构成(),则当前最长序列为dp[i-2]时的最长序列加上当前的两个
                    dp[i] = dp[i-2] + 2
                else:
                    # 前一个也是),先找到前一个)的开始位置,如果在这最长序列之前一个位置是(的话,则可以和当前的)构成一个合法序列,同时要加上dp[i-dp[i-1]-2],即加上前一个`(...)((....))`两个连续有效括号的链接
                    if i - dp[i-1] -1 >= 0 and s[i - dp[i-1] -1] == '(':
                        dp[i] = dp[i-1] + 2 + (dp[i-dp[i-1]-2] if i-dp[i-1]-2 >= 0 else 0)
        return max(dp)
                    

以上是关于Python描述 LeetCode 32. 最长有效括号的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 32.最长有效括号

[Leetcode] 32.最长有效括号

leetcode-32-最长有效括号

leetcode 32: 最长有效括号

Leetcode(32)-最长有效括号

Leetcode_32最长有效括号