美文网首页
平衡括号(五)——最长平衡括号子串

平衡括号(五)——最长平衡括号子串

作者: 旺叔叔 | 来源:发表于2018-11-13 18:07 被阅读0次

    LeetCode_32_LongestValidParentheses

    题目分析:

    其实这题并没有用上平衡括号特性,只是一个以平衡括号为载体的dp题。
    算是个收集癖写在这里。但是记得这跟平衡括号,其实没啥特别关系。
    要用上dp了。子串常见的定义法。就是另dp[i]为
    "以i为结尾"
    "以i为结尾"
    "以i为结尾"
    的子串的对应结果。
    方程
      1.s[i]如果是左括号,一个左括号结尾自然是0。
      2.s[i]如果是右括号
        就看在dp[i - 1]的"对称位置"是否是左括号
        int pre = i - dp[i - 1] - 1;//对称
        2.1如果不是,一个右括号结尾,就是0。
        2.2如果是
        if(pre >= 0 && chas[pre] == '(')
        长度就扩充2。并且!!!如果pre不是开始位置,加上dp[pre - 1]。
        为了这种情况 ()(()) 续上之前的子串。
        dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
    

    解法:

    public static int longestValidParentheses2(String s) {
        /**
         * 动态规划,dp[i]为以s[i]为结尾的最长有效字串长度
         * s[i]=='(',dp[i]为零
         * s[i]=')',看对称位置是否为'(',注意()(()),这种情况,前面也得加上
         * 和我想法一样 但是没有写下去 凸(艹皿艹 )
         */
        char[] chas = s.toCharArray();
        int[] dp = new int[chas.length];
        int res = 0;
        for(int i = 1; i < chas.length; i++){
            if(chas[i] == ')'){
                int pre = i - dp[i - 1] - 1;//对称
                if(pre >= 0 && chas[pre] == '('){
                    /**
                     * pre > 0 ? dp[pre - 1] : 0
                     * 解决了  ()(())  这种情况的连接问题
                     */
                    dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
                }
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }

    相关文章

      网友评论

          本文标题:平衡括号(五)——最长平衡括号子串

          本文链接:https://www.haomeiwen.com/subject/qmwlfqtx.html