给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
动态规划:
我们用 dp[i]
表示以 i
结尾的最长有效括号;
当 s[i]
为 (
,dp[i]
必然等于 0
,因为不可能组成有效的括号;
那么 s[i]
为 )
1 当 s[i-1]
为 (
,那么 dp[i] = dp[i-2] + 2
;
2 当 s[i-1]
为 ) 并且 s[i-dp[i-1] - 1]
为 (
,那么 dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2]
;
时间复杂度:O(n)
。
代码实现:
class Solution {
public:
int longestValidParentheses(string s) {
if(s.size() == 0 || s.size() == 1)
return 0;
vector<int>f(s.size(),0);
f[0] = 0;
if(s[1] == '(')
f[1] = 0;
else if(s[1] == ')'&& s[0] =='(')
f[1] = 2;
for(int i = 2;i < s.size();++i)
{
if(s[i] == '(')
f[i] = 0;
else if(s[i] == ')')
{
if(s[i-1] == '(')
{
f[i] = f[i-2] + 2;
}
else if(s[i-1] == ')' && i - f[i - 1] - 1 >= 0 && s[i-f[i-1] - 1] == '(')//判断边界
{
f[i] = f[i-1] + 2;
if(i - f[i-1] - 2 >=0)
f[i] += f[i - f[i-1] - 2];
}
}
}
return *max_element(f.begin(),f.end());
}
};