32. 最长有效括号
dp[i]:以i结尾的最长有效括号的长度。
当前必须为')' 可以划分为两个集合,分别是上一个字符为左括号和右括号,分别讨论转移方程式。
代码:
class Solution {const int N = 3e4+10;
public:int longestValidParentheses(string s) {int dp[N];//dp[i]:以i结尾的最长有效括号子串的长度。memset(dp,0,sizeof dp);int res=0;for(int i=1;i<s.length();i++){if(s[i]==')'){if(s[i-1]=='('){dp[i]=(i>1?dp[i-2]:0)+2;}else{if(i>=(1+dp[i-1])&&s[i-1-dp[i-1]]=='('){dp[i]=dp[i-1]+2+(i>(2+dp[i-1])?dp[i-2-dp[i-1]]:0);}else{dp[i]=0;//找不到匹配}}}res=max(res,dp[i]);}return res;}
};