题目
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例1
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例2
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
思路
- 使用动态规划。
- 遍历字符串,如果当前字符为’(’,那么以此为结尾的括号串肯定是无效的,所以有效长度为0。
- 如果当前字符为’)’,有以下两种情况:
- 如果前一个字符为’(’,则dp[i] = 2 + dp[i-2],这里要保证i-2 >= 0。
- 如果前一个字符为’)’,则dp[i] = dp[i-1] + 2 + dp[i-2-dp[i-1]],这里要保证i-2-dp[i-1] >= 0。
代码
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> dp( s.size(), 0 );
int maxVal = 0;
for ( int i = 1; i < s.size(); ++i ) {
if ( s[i] == ')' ) {
if ( s[i-1] == '(' ) {
dp[i] = 2 + ( i > 2 ? dp[i-2] : 0 );
}
else if ( s[i-1] == ')' ) {
int j = i - 1 - dp[i-1];
if ( j >= 0 && s[j] == '(' ) {
dp[i] = dp[i-1] + 2;
dp[i] += ( j - 1 >= 0) ? dp[j-1] : 0;
}
}
maxVal = max( maxVal, dp[i] );
}
}
return maxVal;
}
};