题目描述

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

示例 1:

输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

题目解析
本题可以通过动态规划方法进行求解,dp[i]为当前i位置有效括号长度。
1、循环遍历s,当遇到右括号时,尝试向前匹配左括号:

			if s[i] == ')':
                pre = i - dp[i - 1] - 1

2、如果是左括号,则更新匹配后的长度:

				if pre >= 0 and s[pre] == '(':
                    dp[i] = dp[i - 1] + 2

3、处理独立的括号对的情形 类似()()、()(())

					 if pre>0:
                        dp[i] += dp[pre-1]

完整代码

'''
动态规划
'''
class Solution:
    def longestValidParentheses(self, s: str) -> int:
        length = len(s)
        if not s:
            return 0
        dp = [0] * length
        for i in range(1, length):
            if s[i] == ')':
                pre = i - dp[i - 1] - 1
                if pre >= 0 and s[pre] == '(':
                    dp[i] = dp[i - 1] + 2
                    if pre > 0:
                        dp[i] += dp[pre - 1]
        return max(dp)