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.
The stack has to record the position before matching '('. If matching, The position of ')' - the position + 1 is the answer since the parentheses between them have been eliminated.
class Solution {
public:
int longestValidParentheses(string s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
stack<int> sta;
int i = 0, j = 0, maxV = 0, count = 0;
for (i = 0; i < s.length(); ++i) {
if (s[i] == '(')
sta.push(i);
else {
if (!sta.empty() && s[sta.top()] == '(') {
sta.pop();
if (sta.empty())
count = i + 1;
else
count = i - sta.top();
if (count > maxV)
maxV = count;
}
else
sta.push(i);
}
}
return maxV;
}
};
Python Version:
class Solution:
def longestValidParentheses(self, s):
maxCount, slen = 0, len(s)
stack = []
for i in range(slen):
if (s[i] == '('):
stack.append(i)
elif (s[i] == ')'):
if (stack and s[stack[-1]] == '('):
stack.pop()
lastPos = stack[-1]+1 if stack else 0
curCount = i-lastPos+1
if (curCount > maxCount):
maxCount = curCount
else:
stack.append(i)
return maxCount
s = Solution()
print(s.longestValidParentheses(")()())"))