题目
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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;i<len;i++)
{
if(s[i]=='(')
{
stack[++top]=i;
}
else{
top--;
if(top==-1)
{
stack[++top]=i;
}
else{
temp=i-stack[top];
}
if(temp>max)
{
max=temp;
}
}
}
return max;
}