题目
定义如下规则:
- 空串是「平衡括号序列」
- 若字符串S是「平衡括号序列」,那么[S]和(S)也都是「平衡括号序列」
- 若字符串A和B都是「平衡括号序列」,那么AB(两字符串拼接起来)也是「平衡括号序列」
例如,下面的字符串都是平衡括号序列:
()
,[]
,(())
,([])
,()[]
,()[()]
而以下几个则不是:
(
,[
,]
,)(
,())
,([()
现在,给定一个仅由 (
,)
,[
,]
构成的字符串s,请你按照如下的方式给字符串中每个字符配对:
- 从左到右扫描整个字符串。
- 对于当前的字符,如果它是一个右括号,考察它与它左侧离它最近的未匹配的的左括号。如果该括号与之对应(即小括号匹配小括号,中括号匹配中括号),则将二者配对。如果左侧未匹配的左括号不存在或与之不对应,则其配对失败。
配对结束后,对于s中全部未配对的括号,请你在其旁边添加一个字符,使得该括号和新加的括号匹配。
输入输出格式
输入格式
输入只有一行一个字符串,表示s。
输出格式
输出一行一个字符串表示你的答案。
输入输出样例
输入样例
([()
输出样例
()[]()
解析
- 搞一个栈存放所有左括号;一个栈存放所有左括号出现的位置;一个数组存放匹配结果,匹配成功则为空格,输出时忽略。
- 如果是左括号则入栈,如果是右括号则看看最左边还有没有左括号,匹配成功则弹栈。修改该匹配成功的左括号的匹配结果。
- 最后按序输出即可。
#include<iostream>
#include<string>
using namespace std;
int top,w[110];
string a;
char s[110],c[110];
int main(){
cin>>a;
int n=a.length();
for(int i=0;i<n;i++){
if(a[i]=='('||a[i]=='['){
s[++top]=a[i];
w[top]=i;
if(a[i]=='('){
c[i]=')';
}
else{
c[i]=']';
}
}
if(a[i]==')'){
if(top&&s[top]=='('){
c[w[top]]=' ';
top--;
}
else{
c[i]='(';
}
}
if(a[i]==']'){
if(top&&s[top]=='['){
c[w[top]]=' ';
top--;
}
else{
c[i]='[';
}
}
}
for(int i=0;i<n;i++){
if(c[i]=='('||c[i]=='['){
cout<<c[i]<<a[i];
}
else if(c[i]==')'||c[i]==']'){
cout<<a[i]<<c[i];
}
else{
cout<<a[i];
}
}
return 0;
}