您的位置:首页 > 其它

[Jobdu] 题目1337:寻找最长合法括号序列

2014-08-08 15:43 232 查看
题目描述:
给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配;所有的右括号都有唯一的左括号匹配。例如:((()))()()便是一个长度为10的合法括号序列,而(()))( 则不是。
需要你求解的是,找出最长的合法括号子序列的长度,同时找出具有这样长度的序列个数。
输入:
测试数据包括多个,每个测试数据包含两行:
第一行为一个整数N,其中N不会超过10^6。
第二行为一个长度为N的字符串,这个字符串由左括号'('和右括号')'组成。
输出:对应每个测试案例,输出一行,其中包含两个整数,分别代表最长合法括号序列的长度和个数,中间由空格隔开。若没有合法的子序列存在,则返回0 1。样例输入:
6
(())()
3
))(

样例输出:
6 1
0 1


用一个bool型的数组来标记匹配情况。

#include <iostream>
#include <stack>
#include <string>
#include <cstring>
using namespace std;

int n;
string s;

void getRes() {
bool a[s.length()];
memset(a, false, s.length());
stack<int> st;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == '(') {
st.push(i);
} else {
if (!st.empty()) {
a[i] = true;
a[st.top()] = true;
st.pop();
}
}
}

int max = 0, cnt = 1, tmp = 0;
for (int i = 0; i < s.length(); ++i) {
if (a[i]) {
++tmp;
} else {
tmp = 0;
}
if (max == tmp && max != 0) {
++cnt;
} else if (max < tmp) {
max = tmp;
cnt = 1;
}
}
cout << max << " " << cnt << endl;
}

int main() {
while (cin >> n) {
cin >> s;
getRes();
}
return 0;
}

/**************************************************************
Problem: 1337
User: hupo250
Language: C++
Result: Accepted
Time:310 ms
Memory:7604 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: