142/300
- 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
思路:动态规划
无非两种可能:遇到左括号or遇到右括号
1. 当遇到左括号:
无法组成一个有效括号,散了吧
2. 当遇到右括号:
2.1. 右括号的前面s[i-1]
正好是左括号 “()”:
有效,记下来 dp[i] = dp[i-2] + 2
2.2. 右括号的前面又是右括号"…))":
如果前面右括号的前面是左括号,那就有趣了"(…))":
这里需要判定再前面s[i-dp[i-1]-1]
是个啥玩意,如果是"(",那正好配对儿:
dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-1-1]
如图:
class Solution:
def longestValidParentheses(self, s: str) -> int:
res = 0
dp = [0]*len(s)
for i in range(1, len(s)):
if s[i] == ')' and s[i-1]=='(':
dp[i] = dp[i-2] + 2
if s[i] == ')' and s[i-1] == ')':
if i-dp[i-1] >= 1 and s[i-dp[i-1]-1] =='(':
dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2]*(i-dp[i-1] >= 2)
res = max(res, dp[i])
return res