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