Description
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.
Analysis
这道题是让我们求出最长有效括号对的子串长度。
比如说字符串()(()),这个字符串整体为有效的括号对,所以最长为6;字符串)()())的最长有效括号对子串为()(),长度为4;
我们采用动态规划的方法来解决。
首先构造一个长度为n的数组dp,dp[i]存储了一s[i]为结尾的字符串的最长有效括号对子串的长度。
如果s[i] == '(' :dp[i] = 0;
如果s[i] == ')' :
如果s[i-1] == '(' dp[i] = dp[i-2] + 2;
如果s[i-1] == ')' && s[i-dp[i-1]-1] == '(' dp[i] = dp[i-1]+2+dp[i-dp[i-1]-2];
最后返回最大值即可。
Solution
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.length();
if(s.length() <= 1) return 0;
int max = 0;
int dp[n];
for (int i = 0; i < n; i++) {
dp[i] = 0;
}
for(int i = 1; i < n; i++){
if(s[i] == ')') {
if(s[i-1] == '(') {
if (i-2 > 0) {
dp[i] = dp[i-2]+2;
} else {
dp[i] = 2;
}
} else {
if(i-dp[i-1]-1 >= 0 && s[i-dp[i-1]-1] == '('){
if (i-dp[i-1]-2 >= 0) {
dp[i] = dp[i-1]+2+dp[i-dp[i-1]-2];
} else {
dp[i] = dp[i-1]+2;
}
}
}
}
if (dp[i] > max) max = dp[i];
}
return max;
}
};