您的位置:首页 > 其它

LeetCode Longest Valid Parentheses

2015-01-28 20:02 316 查看


觉得本题是我见过为数不多的O(N)复杂度的dp,当然思想也比较巧妙,不过这题不是我自己想出来的,但是我理解了参考文章的意思,并且修改dp方程,也算是一种收获吧,主页是由于这个括号匹配问题和卡特兰数有关,所以我的dp方程就是往二维的去想了,但是这题就是超时。

dp[i]表示以第i个字符为结尾的最长合法串,首先如果这个字符是左括号,那么有dp[i]=0,

否则计算dp[i]可能需要dp[i-1]的值,就是dp[i-1]表示以第i-1个字符为结尾的最长合法串,那么在这个串之前如果刚好是了‘(’那么有dp[i]=dp[i-1]+2 ,当然这个字符可能已经越界并不存在。关键是这样还不够,假如第i-1-dp[i-1]-1个字符存在,dp[i]那么还得加上它的dp值,因为这段可以和计算的dp[i]接起来形成更长的长度,可能说的不是很清楚,代码如下:

int dp[50001];
class Solution {
public:
int longestValidParentheses(string s) {
int l=s.size();
memset(dp,0,sizeof(dp));
int i;
int ans=0;
for(i=1;i<l;i++)
{
if(s[i]==')')
{
if(i-1-dp[i-1]>=0)
{
if(s[i-1-dp[i-1]]=='(')
{
dp[i]=dp[i-1]+2;
if(i-1-dp[i-1]>0)
dp[i]+=dp[i-2-dp[i-1]];
}
}
}
if(ans<dp[i])
ans=dp[i];
}
return ans;

}
};


最后的结果就是max(dp[i]),dp真的是一个好神奇的东西!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: