这道题的目标是求一个仅含左右括号的字符串中,最长连续的有效匹配长度。
例如((())是4,()(()是2,等等。
说是动态规划…其实我觉得不至于,不过递推形式和DP有些类似,上代码。
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size();
int max = 0, p=-1;
int *st = new int[n], *L = new int[n];
// st是一个栈,栈顶元素为"当前配对的左括号的下标"
// L[i]为s[0...k]中包含字符s[k]的最长匹配长度
// 即s[0...k]最长匹配后缀的长度
for(int i=0;i<n;i++)
{
L[i] = 0; // 初始化
// 左括号不可能是某个匹配的结尾,所以L[i]=0
if(s[i] == '(')
st[++p] = i;
else if(s[i] == ')')
{
if(p>=0)
{
// 称形如"(())"的后缀为连续匹配段,则
// L[st[p]-1]是当前连续匹配段之前已有的长度
// L[i-1]是当前连续匹配段的长度
if(st[p]-1>0)
L[i] = L[st[p]-1]+L[i-1]+2;
else L[i] = L[i-1]+2;
p--;
}
else
{
L[i] = 0;
}
}
if(L[i] > max) max = L[i];
}
delete[] L;
delete[] st;
return max;
}
};