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.
Just like parentheses matching, we can use a stack to keep the starting index of each valid substring.
C++ Code:
/*
* func: longest_valid_parentheses
* goal: find the length of the longest valid parentheses substring
* @param s: input string s
* return: the maximum length
*/
int longest_valid_parentheses(string s){
int max_length = 0;
int last = -1;
vector<int> helper;
for(int i=0; i<static_cast<int>(s.length()); ++i){
if(s.at(i) == '('){
helper.emplace_back(i);
}else{
if(helper.empty()){
last = i;
}else{
helper.pop_back();
if(helper.empty()){
max_length = max(max_length, i - last);
}else{
max_length = max(max_length, i - helper.back());
}
}
}
}
return max_length;
}
Python Code:
# func: find the length of the longest valid
# (well-formed) parentheses substring
# @param s: input parentheses string
# @return: the maximum length
# complexity: time O(n), space O(1)
def longest_valid_parentheses(s):
#start index of each valid substring
left = -1
index = 0
max_len = 0
#list for indices of open parentheses
open_stack = []
while index < len(s):
#If it is open parenthesis, add it to the stack
if s[index] == '(':
open_stack.append(index)
else:
#If we are starting with close parenthesis, we
#need to change left index of the valid substring
if not open_stack:
left = index
else:
open_stack = open_stack[:-1]
if not open_stack:
#If the stack is empty, the length will be index - left
max_len = max(max_len, index - left)
else:
max_len = max(max_len, index - open_stack[-1])
index += 1
return max_len
No comments:
Post a Comment