leetcode 32. 最长有效括号

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

 

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:

输入:s = ""
输出:0
 

提示:

0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

posted @ 2021-04-15 09:11  旺仔古李  阅读(57)  评论(0编辑  收藏  举报