LeetCode---32.最长有效括号

题目来源: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;
}

猜你喜欢

转载自blog.csdn.net/qq_39241239/article/details/82666153