题目描述:
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
题目分析:
这个题可以用到动态规划其实我一开始也是没有想到的,那我们具体探讨以下它的状态转移方程。
我们定义dp[i]表示以第i个字母结尾的子串最长有效括号长度,毫无疑问以’('结尾的肯定是0,因为有效的括号组一定以‘)’结尾。如果s[i]是右括号,s[i-1]是左括号,此时的状态转移方程就是dp[i]=dp[i-2]+2。如果s[i-1]是右括号呢,这个时候我们举例"(())",我们知道了dp[i-1]也就是知道了前一个右括号的有效的值,那么我们可以定位到i-dp[i-1]-1,判断这个地方是不是左括号是的话,毫无疑问dp[i]=dp[i-1]+dp[i-dp[i-1]-2]+2,不是的话就是0。
附上代码:
class Solution {
public:
int longestValidParentheses(string s) {
int dp[1000001]={0};
if(s.size()==0)
return 0;
int ans=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
dp[i]=0;
else
{
if(i-1>=0)
{
if(s[i-1]=='(')
{
dp[i]=(i-2)>=0?dp[i-2]+2:2;
}
else
{
if((i-dp[i-1]-1)>=0&&s[i-dp[i-1]-1]=='(')
dp[i]=i-dp[i-1]-2>=0?dp[i-1]+dp[i-dp[i-1]-2]+2:dp[i-1]+2;
}
}
}
ans=max(ans,dp[i]);
}
return ans;
}
};