leetcode算法第32题最长有效括号(动态规划)

题目描述:

leetcode算法第32题最长有效括号(动态规划)_第1张图片

暴力求解法就不多赘述了,我们直接说动态规划的方法。

思路:

我们定义dp[i] 表示以下标 i 字符结尾的最长有效括号的长度。我们将dp 数组全部初始化为 0 。

显然有效的子串一定以‘)’ 结尾,因此我们可以知道以‘(’ 结尾的子串对应的dp 值必定为 0 ,我们只需要求解‘)’ 在dp 数组中对应位置的值。

我们从前往后遍历字符串求解dp 值,我们每两个字符检查一次:

1. s[i]=‘)’ 且 s[i−1]=‘(’,也就是字符串形如“……()”,我们可以推出:
dp[i]=dp[i−2]+2

我们可以进行这样的转移,是因为结束部分的 "()" 是一个有效子字符串,并且将之前有效子字符串的长度增加了 2 。

2. s[i]=‘)’ 且 }s[i−1]=‘)’,也就是字符串形如 “……))”,我们可以推出:
如果s[i−dp[i−1]−1]=‘(’,那么
dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2


代码:

class Solution {
    public int longestValidParentheses(String s) {
        int len = s.length();
        int maxLen = 0;
        int dp[] = new int[len];
        for (int i = 1; i < len; i++) {
            if(s.charAt(i) == ')') {
                if(s.charAt(i - 1) == '(') {
                    dp[i] = (i > 1 ? dp[i - 2] : 0) + 2;
                }else if(i > dp[i - 1] && s.charAt(i - dp[i - 1] - 1) == '(') {
                    dp[i] = dp[i - 1] + (i - dp[i - 1] - 2 > 0 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
            }
            if(dp[i] > maxLen) {
                maxLen = dp[i];
            }
        }
        return maxLen;
    }
}

你可能感兴趣的:(算法,动态规划,leetcode,算法)