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.
维持一个字符栈和位置栈,字符栈记录没有匹配的字符,位置栈记录每一个入栈的字符的位置,如果入栈的是右括号,并且栈顶为左括号,则退栈,求出当前连续退栈的字符长度,求出这个最大值就是。
左括号入栈和没有匹配的右括号入栈
int longestValidParentheses(char* s) {
int tmp=0,i=0, max=0;
int s_length=strlen(s);
char* s_stack=malloc(sizeof(char)*s_length);
int* number_stack=malloc(sizeof(int)*s_length);
int s_stack_index=0;
while(i<s_length){
if(s[i]=='('){
s_stack[s_stack_index]=s[i];
number_stack[s_stack_index]=i;
s_stack_index++;
} else {
if (s_stack_index>=1 && s_stack[s_stack_index-1]=='('){
s_stack_index--;
if(s_stack_index==0) tmp=i+1; // 栈里的出栈出完了的话,说明出栈完
else tmp=i-number_stack[s_stack_index-1];
if(tmp>max) max=tmp;
} else {
s_stack[s_stack_index]=s[i];
number_stack[s_stack_index]=i;
s_stack_index++;
}
}
i++;
}
free(s_stack);
free(number_stack);
return max;
}