文章
4
粉丝
0
获赞
1
访问
98
#include <iostream>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <stack>
using namespace std;
int main(void) {
/*
只统计有效的括号
1. ()()()
如何统计, 如果我们栈记录左括号的下标, 那么每有一个右括号我们应该弹出一个,
并且更新长度, 如何更新长度呢?在栈初始化一个 【虚空】位置, 表明这个位置之后的才可能是合法位置
这样,每次弹出, 都以这个为界限 即 [st.top() + 1, i] 为合法区间
2. ))()
一开始的右括号全是违规的, 那么按上述处理, 当栈内元素个数为1时, 表明无合法序列
那么我们更新最近的违规距离, 标记 st.top() + 1可能是合法开始即可
*/
string s;
cin >> s;
int n = s.size();
stack<int> st; // 记录下标
st.push(-1);
int ans = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(') {
st.push(i);
}
else {
if (st.size() > 1) {
// 有合法区间, 则 计算最大长度
st.pop();
ans = max(ans, i - st.top()); // [st.top() + 1, i] 为合法区间
}
else {
s...
登录后发布评论
暂无评论,来抢沙发