栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【c++】【leetcode32】最长有效括号(动态规划)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【c++】【leetcode32】最长有效括号(动态规划)

最长有效括号

解题思路

用动态规划来做,dp[i]表示以第i个结尾的最长有效括号,因此以'('结尾的都为0。
如何去计算以')'结尾的dp[i]值?

  • 如果s[i-1] = '(',dp[i] = dp[i-2] + 2
  • 如果s[i-1] = ')',此时要判断 ')'是否合理,如果不合理,dp[i]=0,如果合理,前一个合理的最长的前一个必然是'(',此时dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];。


注意数组可能越界的问题
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)

代码
class Solution {
public:
    int longestValidParentheses(string s) {
        int n = s.size();
        if(!n)return 0;
        vector dp(n);
        int ans = 0;
        for(int i = 1;i < n;++i){
            if(s[i] == '(')dp[i] = 0;
            else{
                if(s[i - 1] == '(')dp[i] = i-2 < 0? 2: dp[i-2]+2;
                else{
                    if(i - dp[i-1] > 0 && s[i - dp[i-1] - 1] == '(')
                        dp[i] = dp[i-1] + 2 + (i-dp[i-1]-2 < 0 ? 0 :dp[i-dp[i-1]-2]);
                    else dp[i] = 0;
                }
            }
            ans = max(ans,dp[i]);
        }
        return ans;
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869367.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号