题目
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”
Example 2:
Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”
解法
动态规划类的题目首先写出来状态方程,但是一般很难第一时间写出来对的,我的建议是先不用写总的,根据分情况讨论所有情况,最后合并一些情况。
以 ()(()和()(())两种情况为例。
case1为2,case2为6,case2只是多了一个),由此可知当s[i] = )合并以前的情况.
F(i)代表以char a = s[i]是否是有效的字符串里的一个字符,是的话F(i)等于s中最长的有效长度,不是的话为0;
讨论:
s[i] = (时,F(i) = 0;
s[i] = )时,当s[i-1] = (时,F(i) = F(i-2) +2;
当s[i-1] = )时,且s[i-F(i-1)-1]==(,F(i) = F(i-1) + F(i-F(i-1)-2) +2;//合并情况
其他 情况 F(i) = 0;
合并一下case:
- s[i] == ) -> F(i)=F(i-1)+F(i-F(i-1)-2)+2;
2.其他情况 -> F(i) = 0;
代码
int longestValidParentheses(string s) {
int len = s.size(),max = 0;
vector<int> longest(len,0);
for(int i = 1;i<len;i++){
if(s[i]==')' && i-longest[i-1]-1>=0 && s[i-longest[i-1]-1]=='('){
longest[i] = longest[i-1] + (i-longest[i-1] -2>0?longest[i-longest[i-1] -2]:0) + 2;
max = max>longest[i]?max:longest[i];
}
}
return max;
}