题目描述
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
思路解析
动态规划
dp[i]
表示以第 i
个字符结尾的有效括号子串长度。
若 s[i] == '('
,则 dp[i] = 0
;
若 s[i] == ')'
,则考虑s[i - 1]
:
若 s[i - 1] == '('
,则 dp[i] = dp[i - 2] + 2
;
若 s[i - 1] == ')'
,则考虑 s[i - dp[i - 1] - 1]
:
若 s[i - dp[i - 1] - 1] == '('
,则 dp[i] = dp[i - dp[i - 1] - 2] + dp[i - 1] + 2
注意不要写太多层的判断,尽量将判别式合并在一起,否则会出现栈溢出。
代码实现
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> dp(s.length());
int maxLen = 0;
for(int i = 1; i < s.length(); i++) {
if(s[i] == ')') {
if(s[i - 1] == '(')
dp[i] = (i > 1) ? (dp[i - 2] + 2) : 2;
else if(i > dp[i - 1] && s[i - dp[i - 1] - 1] == '(') {
dp[i] = ((i - dp[i - 1] > 1) ? dp[i - dp[i - 1] - 2] : 0) + dp[i - 1] + 2;
}
}
maxLen = (dp[i] > maxLen) ? dp[i] : maxLen;
}
return maxLen;
}
};