Given 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.
题目解析:
让求最长连续匹配括号,其实跟《Valid Parentheses》是一样的,利用一个栈来维护。但要处理栈为空时遇到的是右括号的情况,直接忽略就好。
上面说的不正确!
当输入为()(()()的时候,返回应该是4,但程序却返回了6!单纯的被题目中的例子误导,没有考虑所有情况!
正确的解法是维护一个栈,里面放的不是单纯的字符,放的是'('的位置。
当匹配左括号后(也就是栈中有元素且当前是右括号),先退出栈,然后算坐标差值!才能是距离,比如((()),得到第二个右括号时为4-0。
但是会带来一个问题,如果退出完,就造成无法去计算差值!
首先放入-1代表匹配失效,当程序匹配失效时,就更新栈底,为新的坐标值。
代码如下:
class Solution {
public:
int longestValidParentheses(string str)
{
int n = str.size();
int result = 0;
stack<int> S;
S.push(-1);
for(int i = 0;i < n;i++){
if(str[i] == '('){ //为左括号,入栈
S.push(i);
}
else{ //为右括号
if(S.size()>1){ //当栈的元素多于一个的时候才能出栈
S.pop();
int temp = S.top();
if(i-temp > result)
result = i-temp;
}else{ //栈元素为1个,代表有效字符出栈完毕,且更新的为')'右括号的位置!
S.pop();
S.push(i);
}
}
}
return result;
}
};