int longestValidParentheses(char * s){
int *stack;
int length =strlen(s),k=0,num=0;
stack = (int*)malloc(sizeof(int)*(length+1));
for(int i=0; i<length; i++){
if(i==0 || k==0)
stack[k++] = i;
else
if(s[stack[k-1]]=='(' && s[i]==')'){
k--;
}else{
stack[k++] = i;
}
}
if(k==0)
return length;
//若栈中没有元素了,则代表整个字符串S都是有效的字符串数组
else
num = stack[0];
stack[k] = length;
for(int j=1; j<=k; j++){
num = (stack[j]-stack[j-1]-1) > num ? (stack[j]-stack[j-1]-1) : num;
}
return num;
}
这里我利用栈来存储字符串的下标。举个栗子,
如输入"()(()"
这个“2”代表什么意思呢!重点来了,它意味着0-1这两个是有效子串,3-4折两个也是有效子串。我们仅需将所有有效子串大小比较,返回最大数即可。
再举个栗子,假设stack最后剩下:
证明了s[0-1],s[3-5],s[7-8]都是有效子串,找出最长的就可以了。
最后放一个结果: