iven a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
For "(()"
, the longest valid parentheses substring is "()"
, which has length = 2.
Another example is ")()())"
, where the longest valid parentheses substring is "()()"
, which has length = 4.
解法一:栈
第一遍循环遍历,找到所有非法的字母符号所在的下标并存入栈中,如果有n个这样的字符,那么它们把s分割成了n+1个子字符串,只要找到最长的字字符串,就是最长的有效括号。
int longestValidParentheses(string s) {
stack<int> stk;
int n=s.size();
//第一次遍历,写入栈中非法括号的下标
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')
{
stk.push(i);
}else
{
if(stk.size()>0&&s[stk.top()]=='(')
stk.pop();
else
stk.push(i);
}
}
if(stk.empty()) return n;
int maxcnt=0,idx=n;
while(!stk.empty())
{
maxcnt=max(maxcnt,idx-stk.top()-1);
idx=stk.top();
stk.pop();
}
maxcnt=max(maxcnt,idx);//不要忘记第一个子字符串的长度
return maxcnt;
}
解法2:动态规划
dp[i]:表示以s[i]结尾的最长有效的括号。
当s[i]=‘(’,dp[i]=0,因为一个有效的括号串不能以其结尾。
当s[i]=‘)'时,s[i-1]==‘(’,此时的'xxx()'是有效的,只要dp[i-2]+2;s[i-1]==')',xxX(xxx)),只有当'X'==‘)’时,有效,此时为
dp[i]=2+dp[i-1]+dp[i-dp[i-1]-2]。
int longestValidParentheses(string s) {
int n=s.size();
vector<int> dp(n,0);
int i,maxlen=0;
for(i=1;i<n;i++)
{
if(s[i]==')')
{
if(s[i-1]=='(')
{
dp[i]=2+(i-2>=0?dp[i-2]:0);
maxlen=max(maxlen,dp[i]) ;
}else
{
if(i-dp[i-1]-1>=0&&s[i-dp[i-1]-1]=='(')
dp[i]=2+dp[i-1]+(i-dp[i-1]-2>=0?dp[i-dp[i-1]-2]:0);
maxlen=max(maxlen,dp[i]);
}
}
}
return maxlen;
}