寻找最长的合法括号序列

问题:假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给你的任务便是去掉其中的一些括号,使得剩下的括号序列能够左右括号匹配且长度最长,即最长的合法括号序列。


输入:测试数据包括多个,每个测试数据只有一行,即一个随机的括号序列,该括号序列的长度保证不超过10的6次方。

输出:对于每个测试案例,输出一个整数,表示最后剩下的最长合法括号序列长度。

样例输入:
(())()
(()

样例输出:
6
2

实现代码:


#include <iostream>
#include <stack>
#include <string>
#include <string.h>

using namespace std;

int main(int argc,char **argv){
string line;
int i,cnt=0;
stack<char> s;
for(;cin>>line;){
char *cs=new char[line.size()+1];
memset(cs,0,line.size()+1);
memcpy(cs,line.c_str(),line.size());
s.push(cs[0]);
for(cnt=0,i=1;i<line.size();++i){
if(cs[i]==')'&&!s.empty()&&s.top()=='(') {
cnt+=2;
s.pop();
}else s.push(cs[i]);
}
cout<<cnt<<endl;
delete cs;
for(;!s.empty();) s.pop();
}
return 0;
}




运行结果:

[img]http://dl.iteye.com/upload/attachment/0063/8114/674ad4b0-906d-3b37-947c-cb8c3319d4a7.jpg[/img]

[img]http://dl.iteye.com/upload/attachment/0063/8116/94777d2a-9943-3b68-8fc7-5b3a3134751a.jpg[/img]
题目描述 Saki 在 Koboshi 的安利下开始玩起了一款简单的游戏。 游戏中,每个关卡会给你一个合法的括号串。合法的括号串定义如下: 空串和 () 为合法的括号串; 设 A 为合法的括号串,那么 (A) 为合法的括号串; 设 A 和 B 为合法的括号串,那么 AB 为合法的括号串。 游戏中,每次操作可以交换两个相邻的括号,而游戏的目标是通过若干次操作使括号串变得非法。 而 Saki 并不知道自己的操作数是否已经优化到最少,所以她想问游戏领域大神 Koboshi 她的操作数是否是最少的。而 Koboshi 因为手和脚都在玩游戏,所以她把这件事情丢给了你,让你求得通关所需最少的操作次数。 当然游戏有 𝑇 T 个关卡,Saki 需要知道每一关通关所需的最少操作次数。 输入格式 第一行一个正整数 𝑇 T,代表关卡数量。 接下来 𝑇 T 行,每行一个合法的括号串,表示每一关给出的括号串。 输出格式 共 𝑇 T 行,第 𝑖 i 行表示通过第 𝑖 i 关所需要的最少的操作次数。 数据范围 对于 30 % 30% 的数据, 1 ≤ 𝑇 ≤ 100 1≤T≤100, 2 ≤ 𝑛 ≤ 8 2≤n≤8; 对于另外 30 % 30% 的数据, 1 ≤ 𝑇 ≤ 50 1≤T≤50, 2 ≤ 𝑛 , ∑ 𝑛 ≤ 100 2≤n,∑n≤100; 对于 100 % 100% 的数据, 1 ≤ 𝑇 ≤ 1 0 5 1≤T≤10 5 , 2 ≤ 𝑛 , ∑ 𝑛 ≤ 1 0 6 2≤n,∑n≤10 6 。保证 𝑆 S 是合法括号序列/
最新发布
08-27
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值