执行用时:12 ms, 在所有 C 提交中击败了18.93%的用户
内存消耗:16.9 MB, 在所有 C 提交中击败了5.13%的用户
//本题的思路就是利用两个堆栈,当遇到左括号时,将其下标压入stack栈中,当遇到右括号时,
//弹出前一个左括号的下标,同时将左右括号的下标都保存在堆栈resstack中,最后将resstack进行排序,
//连续的括号对数其下标也应该是连续的,所以求出下标连续的长度就是最终结果
int complare(const void*a,const void* b){
return *(int*)a-*(int*)b;
}
int longestValidParentheses(char * s){
int* stack = (int*)malloc(sizeof(int)*30000);//定义堆栈,存放s下标
int* resstack = (int*)malloc(sizeof(int)*30000);//定义堆栈存放有效括号的下标
int len = strlen(s);
if(len==0)return 0;
int numresstack=0,numstack=0,res=0,max=0;
for(int i=0;i<len;i++){
if(s[i]=='('){
//if(numstack!=0)
stack[numstack++] = i;
}else if(s[i]==')'){
if(numstack>0){
resstack[numresstack++] = stack[--numstack];
resstack[numresstack++] = i;
}
}
}
qsort(resstack,numresstack,sizeof(int),complare);
for(int i=1;i<numresstack;i++){
if(resstack[i]-resstack[i-1]==1){
res++;
}else{
max = fmax(res,max);
res=0;
}
}
max = fmax(res,max);
if(max==0)return 0;
return max+1;
}