Leetcode第三十二题:最长有效括号

题目:

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

示例 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=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

反思:

动态规划还是得好好学学,还要小心数组越界

你可能感兴趣的:(LeetCode)