zoukankan      html  css  js  c++  java
  • leetcode 最长有效括号

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

    示例 1:

    输入: "(()"
    输出: 2
    解释: 最长有效括号子串为 "()"
    

    示例 2:

    输入: ")()())"
    输出: 4
    解释: 最长有效括号子串为 "()()"

    这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[0]到s[i]包含s[i]的最长的有效匹配括号子串长度。则存在如下关系:
    1. dp[0] = 0;
    2. i从1->strlen(s)-1求dp[i],并记录其最大值。若s[i] == ‘)’,则在s中从i开始到0计算dp[i]的值。这个计算分为两步,通过dp[i-1]进行的(注意dp[i -1]已经在上一步求解):
    (1). 在s中寻找从 i -1 结尾的有效括号匹配子串长度,即dp[i-1],跳过这段有效的括号子串,查看前一个字符,其下标为 j = i-1-dp[i-1]。若 j 没有越界,并且s[j] == ‘(’,则 s[i … j]为有效括号匹配,dp[i] =dp[i-1] + 2。
    (2). 在求得了s[i … j]的有效匹配长度之后,若 j -1 没有越界,则 dp[i] 的值还要加上从 j-1 结尾的最长有效匹配,即 dp[i] += dp[j-1]。 --------------------- 作者:zzu51k 来源:CSDN 原文:https://blog.csdn.net/zzuzy/article/details/51223988?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!
    class Solution {
    public:
        int longestValidParentheses(string s) {
            int len = s.size();
            vector<int> dp(len + 5);
            dp[0] = 0;
            int res = 0;
            for(int i=1; i<len; i++) {
                if(s[i] == ')') {
                    int j = i - dp[i-1]-1;
                    if(j >= 0 && s[j] == '(') { 
                        dp[i] = dp[i-1] + 2;
                        if(j >= 1)
                            dp[i] += dp[j-1];
                    }
                }
                res = max(res, dp[i]);
            }
            return res;
        }
    };
  • 相关阅读:
    JavaScript 事件
    Docker 部署asp.netcore
    Docker 安装
    JavaScript 窗口操作
    JavaScript 定时器
    JavaScript Dom
    Javascript try catch es5标准模式
    JavaScript 数组去重
    JavaScript 返回具体类型方法
    mysql 触发器
  • 原文地址:https://www.cnblogs.com/Draymonder/p/9762354.html
Copyright © 2011-2022 走看看