
寻找括号序列中最长匹配括号序列。也是比较经典的动态规划问题了。这道题我记得最早是学习数据结构的时候用栈来解决这个问题,用动态规划解写法会更方便一些。代码如下:
class Solution {
public:
int longestValidParentheses(string s) {
if(s.empty())
return 0;
int n=s.length();
#dp[i]表示以第i个字符结尾的最长有效括号序列的括号个数
vector<int> dp(n,0);
for(int i=1;i<n;i++)
{
if(s[i]==')')
{
int index=i-2*dp[i-1]-1;
if(index<0)
dp[i]=0;
#注意这里匹配后要加上以其匹配的'('前一位结束的最长括号
#否则无法正确处理'()()'的情形
else
dp[i]=(s[index]=='(')?dp[i-1]+((index>0)?dp[index-1]:0)+1:0;
}
#有效括号序列不可能以'('结束
else
dp[i]=0;
}
int ans=0;
for(int i=0;i<n;i++)
ans=max(ans,dp[i]*2);
return ans;
}
};
