栈
题目分析
此题是经典的括号匹配问题,自然需要使用到栈结构
题目要求计算最大的长度,显然在括号成功匹配时括号长度才会增加,比如 [ ] [ ] [ [ ] ] , [ [ [ ] ] ]
由于需要多次计算长度,选择索引作为栈的元素比直接使用字符更加合适
代码部分
先考虑答案在什么地方产生,显然是在出现括号匹配的地方,这里就有两种情况
1.不能与上一次成功匹配的序列相连,单独计算该序列长度 ( ( ) ] [ ]
2.可以与上一次成功匹配的序列相连,计算总长度 ( [ ( ) ] [ ]
所以我们对于左括号可以直接入栈,在栈为空时,将当前括号直接入栈,在栈不为空时,判断是否存在括号匹配,匹配不成功,直接入栈,在匹配成功时需要处理答案,匹配成功后如果栈为空,意味着这段序列一定可以与上一段序列相连直到索引为零,如果栈此时不为空,那么无论序列是否有相连的部分,它的开始位置一定就是栈顶元素(将匹配的部分先出栈)
#include <iostream>
#include <stack>
using namespace std;
const int N = 100005;
char str[N];
int n;
int main()
{
char c;
stack<int>s;
int res = 0;
while(cin >> c)
{
str[n++] = c;
}
for(int i = 0; i < n; i++)
{
if(str[i] == '(' || str[i] == '{' || str[i] == '[') s.push(i);
else if(!s.empty())
{
int t = s.top();
if((str[i] == ')' && str[t] == '(') || (str[i] == ']' && str[t] == '[') || (str[i] == '}' && str[t] == '{'))
{
s.pop();
if(s.empty()) res = max(res, i + 1);
else res = max(res, i - s.top());
}
else s.push(i);
}
else s.push(i);
}
cout << res << endl;
return 0;
}