32. Longest Valid Parentheses

来源:互联网 发布:淘宝保证金计划打不开 编辑:程序博客网 时间:2024/06/05 00:09

1、题目描述

给出一个只含有(和)的字符串,返回最长的括号匹配合法的子串。


2、思路

动态规划。

dp[i] 指的是以位置i结尾的最长合法子串的长度。

初始化:dp[i]=0

状态转移:只有s[i]==),dp[i]才有可能大于0.

1)s[i-1]==(,dp[i] = dp[i-2]+2;

2)s[i-1]==),s[i-dp[i-1]-1]==(

dp[i] = dp[i-1]+2;

if i-dp[i-1]-2 >=0

        dp[i] += dp[i-dp[i-1]-2];


返回最长的dp[i]。

复杂度O(n)


3、代码

    int longestValidParentheses(string s) {        int l = s.size();        if(l==0) return 0;        int ans = 0;        int dp[l] = {0};        for(int i=1;i<l;i++){            if(s[i]==')'){                if(s[i-1]=='('){                    if(i==1) dp[i]=2;                    else dp[i]=dp[i-2]+2;                }                                    else{                    if(s[i-dp[i-1]-1]=='('){                        dp[i]=dp[i-1]+2;                        if(i-dp[i-1]-2>=0)                            dp[i]+=dp[i-dp[i-1]-2];                    }                }                if(dp[i]>ans)                    ans=dp[i];            }                    }        return ans;    }


原创粉丝点击