LeetCode 32题:最长有效括号

题目

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

示例 2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"

示例 3:

输入:s = ""
输出:0

提示:

  • 0 <= s.length <= 3 * 104
  • s[i] 为 '(' 或 ')'

思路

判别有效括号就要想到栈,自己写出来后,数据很不好,在借鉴官方解法后才获得一个比较好看的数据。

具体做法是我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标:

对于遇到的每个 ‘(’\text{‘(’}‘(’ ,我们将它的下标放入栈中
对于遇到的每个 ‘)’\text{‘)’}‘)’ ,我们先弹出栈顶元素表示匹配了当前右括号:
如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」
如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」
我们从前往后遍历字符串并更新答案即可。

需要注意的是,如果一开始栈为空,第一个字符为左括号的时候我们会将其放入栈中,这样就不满足提及的「最后一个没有被匹配的右括号的下标」,为了保持统一,我们在一开始的时候往栈中放入一个值为 −1-1−1 的元素。

作者:力扣官方题解
链接:https://leetcode.cn/problems/longest-valid-parentheses/solutions/314683/zui-chang-you-xiao-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)


代码

#include 
#include 
#include 

int longestValidParentheses(char *s);

int main()
{
    char *s = ")()())";
    printf("%d", longestValidParentheses(s));
    return 0;
}

int longestValidParentheses(char *s)
{
    int len=strlen(s);
    int stack[len+1];
    int temp;
    int max=0;
    int top=-1;
    stack[++top]=-1;
    for(int i=0;imax)
            {
                max=temp;
            }
        }
    }
    return max;
}

你可能感兴趣的:(LeetCode练习题,leetcode,算法,c语言,数据结构)