Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
, which has length = 2.
Another example is ")()())"
, where the longest valid parentheses substring is "()()"
, which has length = 4.
分析
测试字符串的长度会达到10000,算法复杂度必须小于O(n^2),动态规划状态的维度为1才能满足。令p[i]表示以s[i]结尾的所有括号匹配子串的最大长度。状态转移方程如下
若s[i]==')'时
若s[i-1]=='(',则p[i]=2+p[i-2];
若s[i-1]==‘)’,则根据p[i-1],看位置i-p[i-1]-1是否为’与s[i]匹配即是否为‘(’,若匹配,s[i-1]=2+p[i-1]+p[i-p[i-1]-2].
代码
#include <iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
int longestValidParentheses(string s) {
int n=s.size();
if (n<=1) return 0;
int p[n]={0};
int length=0;
for (int i = 1; i < n; ++i) {
if (s[i]==')') {
if (s[i-1]=='(') {
p[i]=(i>=2?p[i-2]:0)+2;
} else if (s[i-1]==')'&&i-p[i-1] > 0&&s[i-p[i-1]-1]=='(') {
p[i]=2+p[i-1]+(i-p[i-1]-2>=0?p[i-p[i-1]-2]:0);
}
}
length=max(length,p[i]);
}
for (int i = 0; i < n; ++i)
cout << p[i] << " ";
cout<<endl;
return length;
}
};
int main() {
Solution s;
string t="(()())";
cout << s.longestValidParentheses(t);
}