32. 最长有效括号

208 阅读1分钟

题目

image.png

思路

  • dp[i]表示以下标i结尾的子串形成的有效长度,()()()->dp=6, ()()()(-> dp=0
  • max即为dp[i]中最大的那个

1F6869527B9BA2A4BEA15A2995A6CD5E.png

代码

class Solution {
    public int longestValidParentheses(String s) {
        int length = s.length();
        if (length == 0) return 0;//特判
        int[] dp = new int[length];
        int max = 0;
        for (int i = 0; i < length; i++) {
            if (s.charAt(i) == ')') {
                if (i - 1 >= 0 && s.charAt(i - 1) == '(') {//【A】注意越界
                    if (i == 1) {//处理(),否则下面 dp[i-2]会越界
                        dp[i] = 2;
                    } else {
                        dp[i] = dp[i - 2] + 2;//
                    }
                } else if (i - 1 >= 0 && s.charAt(i - 1) == ')') {//【B】注意越界
                    if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {//注意越界
                        if (i - dp[i - 1] - 1 == 0) {//处理(()), 否则下面dp[i-dp[i-1]-2]会越界
                            dp[i] = dp[i - 1] + 2;
                        } else {
                            dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
                        }
                        
                    }
                }
            }
            //if (s.charAt(i) == '('),【C】默认dp=0
            max = Math.max(max, dp[i]);
        }
        return max;
    }
}