LeetCode Longest Valid Parentheses

觉得本题是我见过为数不多的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真的是一个好神奇的东西!


你可能感兴趣的:(LeetCode,优化,dp,动态规划)