题目来源:https://leetcode-cn.com/problems/longest-valid-parentheses/description/
题目描述:
算法描述:
1.定义一个maxLength记录最长有效括号长度,beginIndex记录有效括号的起始位置。
2.从字符串的第一个位置开始遍历,遇到左括号的话就入栈,遇到右括号的话就将栈顶元素弹出,并且判断当前序列的有效括号长度。 栈里保存的是左括号的位置。
3.当遇到右括号时,分别有如下几种情况:
(1).当栈为空时,说明该右括号一定无法匹配,这时让beginIndex加1,表明有效括号应该从该右括号的下一个位置开始找
(2).当前栈内有元素,则将栈顶元素出栈。如果弹出后的栈为空,则表明当前括号匹配,这时计算出当前的当前有效括号长度,即当前位置的值i减去beginIndex的值。再让这个值和maxLength比较,若这个值大,则让maxLength等于这个值。
(3).当前栈内有元素并且栈顶出栈后仍然有元素,则当前有效括号长度为当前元素位置减去栈顶元素的位置。
代码如下:
int longestValidParentheses(char* s) {
//计算字符串长度
int len=strlen(s);
//定义一个栈
int stack[len+1];
//可以看成是栈顶指针
int top=-1;
//最长有效括号长度
int maxLength=0;
//有效括号的起始位置
int beginIndex=0;
for(int i=0;i<len;i++){
if(s[i]=='('){
//如果是左括号直接入栈
stack[++top]=i;
}else{
if(top==-1){
//如果是右括号,且当前栈无元素,令有效括号起始位置加1
beginIndex=i+1;
}else{
//如果栈不空,栈顶元素出栈
top--;
if(top==-1){
//如果栈顶出栈后栈为空,说明当前括号匹配,计算当前有效括号长度
maxLength=maxLength>(i-beginIndex+1)?maxLength:(i-beginIndex+1);
}else{
//如果栈顶出栈后栈不为空,则当前有效括号长度为当前元素位置减去栈顶元素的位置
maxLength=maxLength>(i-stack[top])?maxLength:(i-stack[top]);
}
}
}
}
return maxLength;
}