动态规划:leetcode 32 最长有效括号

## 题目

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

案例:

输入: ")()())" 输出:4

输入: "()(())" 输出:6

public int longestValidParentheses(String s) {
        //储存最大长度,返回
        int max = 0;
        //状态数组,数组元素存储当前往前的括号有效的长度
        int[] dp = new int[s.length()];
        //循环,从第二个元素开始往前搜索解答,把结果储存在状态矩阵中
        for (int i = 1; i < s.length(); i++) {
            //当当前的符号是 ')' ,这时候的括号往前是有效的,如果是'(',那么这时对应状态数组中存储为0,为无效括号
            if (s.charAt(i) == ')') {
                //如果前一个符号为'(',那么当前的括号是有效的,最长有效括号长度为其前一个加2
                if (s.charAt(i - 1) == '(') {
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;// 如果i>=2 那这时的dp应该为: dp[i] = dp[i-2] + 2
                    //如果前一个为')',则需要分情况,
                } else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') {// 当 (()()) 这种情况出现   )()())
                    if (i - dp[i - 1] - 2 >= 0) {
                        dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2];
                    } else {
                        dp[i] = dp[i - 1] + 2;
                    }
                }
                max = Math.max(max, dp[i]);
            }
        }
        return max;
    }

测试案例

public static void main(String[] args) {
        L32 l32 = new L32();
        String str = ")()())"; //测试案例 输出 4
        String str2 = "()(())"; //测试案例 输出 6
        int ret = l32.longestValidParentheses(str2);
        System.out.println(ret);
    }

 

posted @ 2019-10-30 09:54  蝴蝶很美终究蝴蝶飞不过沧海  阅读(244)  评论(0编辑  收藏  举报