题意:给定一段由“(”和“)”组成的序列,给出最长括号匹配序列的长度。
解答:动态规划+分类讨论,用ans[i]表示以i开始的最长括号匹配序列的长度。分以下几种情况。
情况1:如果s[i]==‘)’,显然是0,不用讨论。
情况2:如果s[i]=='(',分如下几种情况:
如果s[i+1]==')',则ans[i]=2;
如果s[i+1]=='('并且s[i+1+ans[i+1]]==')',则ans[i]=ans[i+1]+2。
要注意的是,上述情况只讨论了一段括号的情况,没讨论两段括号的情况。即讨论了(())的情况,没考虑()()的情况
所以,如果s[i+ans[i]]=='(',则有两段括号,所以ans[i]=ans[i]+ans[i+ans[i]]。
讨论完之后选取ans[i]中的最大值即可。我觉得这个是我写的最清楚的一篇日志。呵呵。
代码如下(好像代码很短的样子,哈哈,就是很短):
class Solution {
public:
int longestValidParentheses(string s) {
int i,j,ls=s.length(),res=0;
vector<int> ans;
for(i=0;i<ls;i++) ans.push_back(0);
for(i=ls-1;i>=0;i--)
{
if(s[i]=='(')
{
if(i==ls-1) continue;
else if(s[i+1]=='('&&s[i+1+ans[i+1]]==')') ans[i]=ans[i+1]+2;
else if(s[i+1]==')') ans[i]=2;
if(s[i+ans[i]]=='(') ans[i]=ans[i]+ans[i+ans[i]];
}
}
for(i=0;i<ls;i++) res=max(res,ans[i]);
return res;
}
};