栈(难理解)
int longestValidParentheses(char * s){
int n = (int )strlen(s);
if(n==0) return 0;
int max_length=0;
int stack[n+1];
int top=0;
stack[top]=-1;
top++;
for(int i=0;i<n;i++){
if(s[i]=='('){
stack[top]=i;
top++;
}
if(s[i]==')'){
top--;
if(top==0){
stack[top]=i;
top++;
}
else{
max_length = fmax(max_length, i-stack[top-1]);
}
}
}
return max_length;
}
为什么栈空就能表示“当前的右括号为没有与之匹配的左括号的右括号”呢?
之前不是已经pop了一个与之匹配的元素了吗?
----------------------------------------------------------------------------------
关键1:一开始就先压一个-1在栈底
关键2:出入栈的都是下标,不是左右括号
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
因为,如果pop了一个元素之后栈空,就表示,之前pop掉的元素并不是相匹配的左括号,只是栈底那个-1(一开始加进去那个) 或者 是之前没有成功匹配的右括号
----------------------------------------------------------------------------------
那些没有成功匹配的右括号,都是作为连续性的一个中断压在栈底,当遇到下一个没能成功匹配的右括号时,两者匹配出栈。
----------------------------------------------------------------------------------
此时栈空,就说明这个右括号(后者)没能成功匹配左括号,那再把它的下标压入栈底,作为一个中断指标
正向逆向结合法yyds!!!
int longestValidParentheses(char * s){
int n = (int )strlen(s);
int left=0, right=0;
int max_length=0;
for(int i=0;i<n;i++){
if(s[i]=='('){
left++;
}
if(s[i]==')'){
right++;
}
if(left == right ){
max_length = fmax ( max_length, left + right ) ;
}
if(right > left){
left = right = 0;
}
}
left = right = 0;
for(int i=n-1;i>=0;i--){
if(s[i]=='('){
left++;
}
if(s[i]==')'){
right++;
}
if(left == right ){
max_length = fmax ( max_length, left + right ) ;
}
if(right < left){
left = right = 0;
}
}
return max_length;
}