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]结尾的最长有效括号长度
s[i] = '('
,以(
结尾一定不能构成有效括号,为0s[i] = ')'
,此时有两种情况:s[i-1] = '('
:此时s[i]和s[i-1]刚好可以构成一个有效括号,那么可以和前面以s[i-2]结尾的最长序列连起来,即dp[i] = dp[i-2]+2
s[i-1] = ')'
:此时s[i-1]的)可能也前面构成一个最长有效序列(()....()),那么这个有效序列开始的位置即i - dp[i-2]
- 如果此序列开始的前一个位置为
'('
的话,那么可以和当前的)
构成一个有效序列,同时还可以和dp[i - dp[i-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. 最长有效括号的主要内容,如果未能解决你的问题,请参考以下文章