32. 最长有效括号

Problem: 32. 最长有效括号

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

给你一个只包含 ′ ( ′ '(' ( ′ ) ′ ')' ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
我们可以使用动态规划的方法来解决这道题目。我们定义一个 d p dp dp数组,其中 d p [ i ] dp[i] dp[i]表示第i个字符串结尾的最长有效括号的长度。我们从左到右遍历字符串,对于每一个字符串,如果它是 ′ ( ′ '(' (, 那么 d p [ i ] dp[i] dp[i]一定是0, ′ ( ′ '(' (是不能够和前面的进行配对。那么我们需要找到前面能和它配对的’('的位置,这个位置就是 i − d p [ i − 1 ] − 1 i - dp[i - 1] - 1 idp[i1]1。如果这个位置存在并且字符是 ′ ( ′ '(' (,那么 d p [ i ] dp[i] dp[i]就是 d p [ i − 1 ] + 2 dp[i - 1] + 2 dp[i1]+2,再加上 d p [ p − 1 ] dp[p - 1] dp[p1],其中 p p p i − d p [ i − 1 ] − 1 i - dp[i - 1] - 1 idp[i1]1。最后,我们更新答案 a n s ans ans为所有 d p [ i ] dp[i] dp[i]中的最大值。

解题方法

1.初始化dp数组为0,ans为0。
2.从左到右遍历字符串,对于每个字符:

  • 如果它是’(',那么 d p [ i ] dp[i] dp[i]一定是0。
  • 如果它是’)‘,那么我们找到前面能和它配对的 ′ ( ′ '(' (的位置p,如果p存在并且s[p]是’(',那么 d p [ i ] dp[i] dp[i]就是 d p [ i − 1 ] + 2 + d p [ p − 1 ] dp[i - 1] + 2 + dp[p - 1] dp[i1]+2+dp[p1]

更新答案ans为所有 d p [ i ] dp[i] dp[i]中的最大值。
返回ans。

复杂度

时间复杂度:

时间复杂度: O ( n ) O(n) O(n)

空间复杂度:

空间复杂度: O ( n ) O(n) O(n)

Code

class Solution {
    public int longestValidParentheses(String str) {
        char[] s = str.toCharArray();
        int[] dp = new int[s.length];
        int ans = 0;
        for (int i = 1, p; i < s.length; i++) {
            if (s[i] == ')') {
                p = i - dp[i - 1] - 1;
                if (p >= 0 && s[p] == '(') {
                    dp[i] = dp[i - 1] + 2 + (p - 1 >= 0 ? dp[p - 1] : 0);
                }
            }
            ans = Math.max(ans, dp[i]);
        }
        return ans;
    }
}

你可能感兴趣的:(刷题,动态规划)