一个合法的括号序列满足以下条件:
- 序列()被认为是合法的。
- 如果序列X与Y是合法的,则XY也被认为是合法的。
- 如果序列X是合法的,则(X)也是合法的。
例如,(),()(),(())这些都是合法的。
现在,给定一个由 ( 和 ) 组成的字符串。
请你求出其中的最长合法括号子序列的长度。
注意,子序列不一定连续。
输入格式
输出格式
数据范围
前五个测试点满足, 1≤输入字符串的长度≤101≤输入字符串的长度≤10。
所有测试点满足,1≤输入字符串的长度≤1061≤输入字符串的长度≤106。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
6
//合法括号序列两个条件 最后cnt = 0, 前缀序列中 cnt >= 0
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1000010;
char s[N];
int main() {
cin >> s;
//l代表前缀序列中cnt,遇到(+1,遇到)-1
int l = 0, r = 0;
for (int i = 0; s[i]; ++i) {
if (s[i] == '(') l++;
else if (l > 0) {
l--;
r++;
}
}
cout << r * 2 << endl;
return 0;
}