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

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

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

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

本文原创为【亓官劼】(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)