给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题报告:
一题多解问题。
解法一是DP,比较好想,思路也很清晰,就是写起来有点丑陋。dp[i]代表以i为结尾的最长序列长度。
解法二可以用栈,合并的思路和OAE思想的结合。
AC代码1:(dp的思路)
class Solution {
public:
int dp[55555];
int longestValidParentheses(string s) {
int n = s.size();
if(s[1] == ')' && s[0] == '(') dp[1] = 2;
for(int i = 2; i<n; i++) {
if(s[i] == ')') {
if(s[i-1] == ')') {
if(i-1-dp[i-1]>=0 && s[i-1-dp[i-1]] == '(')dp[i] = dp[i-1]+2 + ((i-1-dp[i-1]-1>=0)?dp[i-1-dp[i-1]-1]:0);
else dp[i] = 0;
}
else dp[i] = dp[i-2] + 2;
}
}
int ans = 0;
for(int i = 0; i<n; i++) ans = max(ans, dp[i]);
return ans;
}
};
AC代码2:(栈)
参考wjh巨佬的博客