题目
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.
题目来源:https://leetcode.com/problems/longest-valid-parentheses/
分析
动态规划。创建一维辅助数组dp[0…length-1]。dp[i]表示以s[i]为起点,向右匹配,合法匹配的字符串的长度。以s[i]为起点表示s[i]为合法匹配字符串的第一个字符,也就是说如果s[i] == ‘)’,则dp[i] = 0。
很明显,dp[]的求值应该从右往左求了。如果s[i] == ‘)’,则dp[i] = 0。如果s[i] == ‘(‘,那就看s[i]和s[j]是否匹配。j是跳过以s[i+1]为起点的合法匹配字符串后的位置。即j = i + 1 + dp[i+1]。如果匹配,那dp[i] = dp[i+1] + 2。
事情并没有结束,如果j+1没有越界,那么以j+1为起点的合法匹配字符串就和当前字符串拼接到一起了。
代码
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.length();
if(len <= 1)
return 0;
vector<int> dp(len, 0);
int ans = 0;
for(int i = len - 2; i >= 0; i--){
if(s.at(i) == '('){
int j = i + 1 + dp[i+1];
if(j < len){
if(s.at(j) == ')'){
dp[i] = dp[i+1] + 2;
if(j + 1 < len)
dp[i] += dp[j+1];
ans = max(ans, dp[i]);
}
}
}
}
return ans;
}
};