1360: 删除最外层括号

题目描述

有效的括号字符串有 () , (A) , A+B, 其中A,B也为有效的括号字符串。若有效的括号字符串S非空,且不存在将S分解为A+B的方法(A,B皆为有效的括号字符串),那么S为不可分解的。给出字符串S,我们将其分解为 S = S1+S2+...+Sn, 其中每一个Si都是不可分解的。
现在要求你将S拆分为n个不可分解的串,并去除掉每一个不可分解串最外层的括号。

 

输入

输入包含多组测试样例。
每一组测试样例都是一个合法字符串S (|S|<100)。

输出

对于每组样例,输出分解之后然后去除掉括号的字符串。

样例输入
(()())(())
()(())
样例输出
()()()
()

代码:

#include<bits/stdc++.h>
using namespace std;

//此题实质上要求删除'()'(空括号)和非空括号中不可分解串的外层括号 
string Delete(string s){
	stack<int> st;
	string ans;
	for(int i=0;i<s.size();++i){
		if(s[i]=='('){
			if(!st.empty()) ans+=s[i];
			st.push(i);//左括号下标入栈 
		}
		else{
			st.pop();
			if(st.size()) ans+=s[i];
		} 
	}
	return ans;
}
int main(){
	string s;
	while(cin>>s){
		cout<<Delete(s)<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值