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.
利用栈,每次找到配对的括号,就弹出左括号,并将两括号间的长度压入栈中。注意相邻括号对长度的合并。
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
int l = s.length();
int top = 0, top2 = 0;
int max = 0;
for (int i = 0; i < l; ++i) {
if (s[i] == '(') {
st.push(-1);
} else {
if (st.size() > 0) {
top = st.top();
st.pop();
if (top < 0) {
// ( )
top = 2;
max = max < top ? top : max;
} else {
// ( ... )
if (st.size() > 0) {
st.pop();
top += 2;
max = max < top ? top : max;
} else {
top = -1;
}
}
while (st.size() && (top2 = st.top()) > 0) {
st.pop();
top += top2;
max = max < top ? top : max;
}
if (top > 0) st.push(top);
}
}
}
return max;
}
};