题目:
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人思路:
明显的动态规划问题,老规矩,没啥思路,看了一眼答案解析,老哥的思路太清晰了!!
官方答案推荐:
PS:动态规划适用条件:
①最优子结构:「大规模子问题最优值」仅与「小规模子问题最优值」有关
②无后效性:「大规模子问题最优值」与「小规模子问题最优值」是如何得到的无关
1、动态规划问题解题步骤:
①确定状态:研究最优策略最后一步i并化为子问题
②转移方程:根据子问题定义
③初始条件和边界情况
④计算顺序
2、按步骤分析:
该问题为最值型动态规划,令dp[i]存最长有效子串长度,s[i]为子串的最后一个字符
①确定状态:
1)s[i]为'(',dp[i]=0,当前子串必定非有效子串,因为无匹配的')';
2)s[i]为‘)',则前一个字符s[i-1]为'('或s[i]前面的前面有一个匹配的'(',如 ( xxxxx)
②转移方程:
s[i-1] = '(':dp[i] = dp[i-2] + 2
s[i-1] = ')':dp[i] = dp[i-1] + 2 + dp[i - 2 - dp[i-1]],对应 xxxx(xxxx)这种情况
③初始条件:全设为0,边界情况:1<=i<s.length,i-2-dp[i-1]需要>=0
④计算顺序:从头到尾
python代码:
class Solution:
def longestValidParentheses(self, s: str) -> int:
strLength = len(s)
dp = [0] *strLength
result = 0
if strLength <=1:return 0
for i in range(1,strLength):
if s[i] == ')':
if s[i-1] == '(':
#为防止i-2<0,先赋值再根据转移方程加
dp[i] = 2
if i-2>=0:
dp[i] += dp[i-2]
else:
if i-1-dp[i-1]>=0 and s[i-1-dp[i-1]] == '(':
dp[i] = dp[i-1] + 2
if i-2-dp[i-1] >=0:
dp[i] += dp[i-2-dp[i-1]]
result = max(dp)
return result
反思:
动态规划还是得好好学学,还要小心数组越界