题目
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
解法 动态规划
/*优化dp
dp代表包含第i个元素的最大括号长度
递归规则
dp[i] == ')' dp[i - 1] == '(' : dp[i] = dp[i - 2] + 2
dp[i] == ')' dp[i - 1] == ')' dp[i - dp[i - 1] - 1] == '(':dp[i] = dp[i - 1]+ dp[i - dp[i - 1] - 2] + 2
*/
class Solution {
public:
int longestValidParentheses(string s) {
int len = s.length();
if(len == 1)
return 0;
int *dp = new int[len];
for(int i = 0 ; i < len;i++)
dp[i] = 0;
int maxdp = 0;
for(int i = 1; i < len;i++)
{
if(s[i] == ')' && s[i - 1] == '('&& i == 1)
{
dp[i] = 2;
}
else if(s[i] == ')' && s[i - 1] == '(' && i > 1)
{
dp[i] = dp[i - 2] + 2 ;
//cout<<dp[i]<<endl;
}
else if(s[i] == ')' && s[i - 1] == ')' &&i -dp[i - 1] > 0 && s[i - dp[i - 1] - 1] == '(')
{
if(i - dp[i - 1] - 2 >= 0)
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2;
else dp[i] = dp[i - 1] + 2;
}
else dp[i] = 0;
maxdp = max(maxdp,dp[i]);
//if(i - dp[i - 1] <= 0)
// cout << i << dp[i - 1]<<endl;
}
return maxdp;
}
};