我们的口号是:使用最简洁的代码,完成AC:)
题目介绍
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
提示
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
题目分析
该题是一个比较容易动态规划问题,主要需要确定状态、转移方程。
- 当s[i]为’('时,显然此时的dp[i]应该为0
- 当s[i]为’)‘时,需要分情况考虑
a. 如果s[i-1]为’(‘时,此时dp[i] = dp[i-2]+2
b. 如果s[i-1]为’)'时,此时dp[i] = dp[i-1]+dp[i-dp[i-1]-2]+2
python代码
class Solution:
def longestValidParentheses(self, s: str) -> int:
n = len(s)
dp = [0 for i in range(n)]
res = 0
for i in range(1, n):
if s[i] == ')' and s[i-1] == '(':
if i - 2 > 0:
dp[i] = dp[i-2] + 2
else:
dp[i] = 2
if s[i] == ')' and s[i-1] == ')':
if i - dp[i-1] - 1 > 0:
if s[i-dp[i-1]-1] == '(':
if i - dp[i-1] - 2 >= 0:
dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2]
else:
dp[i] = dp[i-1] + 2
res = max(dp[i], res)
return res
有疑问欢迎留言,我看到会回复哈:))