LeetCode 32 最长有效括号 一般解法
https://leetcode-cn.com/problems/longest-valid-parentheses/
结构选择
在数据结构上机的时候做过类似的,括号的合法性,取决于之前是否存在与之对应的反括号,使用栈的结构来辅助就可以
思路
- 使用一个数组判断当前index的括号是否是属于某个合法括号对之中
int ans[114514];
- 通过栈来判断当前的括号是否合法:如果当前元素为 ‘)’,并且栈顶为 ‘(’,那么表示这一对括号是合法的,如果栈顶没有与之配对的括号( 比如空栈或者 ‘)’ ),那么不合法
- 如果一个左括号和一个右括号匹配上了,将他们的合法数组置一
然后我们会得到一个合法数组:
比如输入 )()()) ,合法数组就会是 0 1 1 1 1 0
- 我们只需要找出合法数组中最长的连续的1串的长度,即是答案
通过代码
class Solution
{
#include <deque>
#define push push_back
#define pop pop_back
#define top back
deque<int> s;
int ans[114514];
public:
int longestValidParentheses(string str)
{
int len = str.length();
for(int i=0; i<len; i++)
{
ans[i] = 0;
}
for(int i=0; i<len; i++)
{
char c = str[i];
// 左括号直接进
if(c == '(')
{
s.push(i);
}
// 右括号,判断是否能匹配
else
{
if(!s.empty())
{
int tp = s.top();
// 合法数组置1
if(str[tp] == '(')
{
ans[tp] = 1;
ans[i] = 1;
}
s.pop();
}
}
}
// 计算最长1串长度
int max = 0;
int l = 0;
int r = 0;
int state = 0; //状态1表示在计数,0表示不在
for(int i=0; i<=len; i++)
{
// 遇到第一个 1 开始计数
if(state==0 && ans[i]==1)
{
state = 1;
l = i;
}
// 遇到0 或者 结尾了,并且最后一个括号是合法的,计算1串长度
else if((state==1 && ans[i]==0) || (i==len && str[i-1]==1))
{
state = 0;
r = i;
int answer = r - l;
if(answer > max)
{
max = answer;
}
}
}
return max;
}
};
更优解法
这篇文章讲的非常详细
https://www.cxyxiaowu.com/7905.html