2530: 【普及-】【P1241】括号序列
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:5
解决:4
题目描述
定义如下规则:
- 空串是「平衡括号序列」
- 若字符串 是「平衡括号序列」,那么 和 也都是「平衡括号序列」
- 若字符串 和 都是「平衡括号序列」,那么 (两字符串拼接起来)也是「平衡括号序列」。
例如,下面的字符串都是平衡括号序列:
()
,[]
,(())
,([])
,()[]
,()[()]
而以下几个则不是:
(
,[
,]
,)(
,())
,([()
现在,给定一个仅由 (
,)
,[
,]
构成的字符串 ,请你按照如下的方式给字符串中每个字符配对:
- 从左到右扫描整个字符串。
- 对于当前的字符,如果它是一个右括号,考察它与它左侧离它最近的未匹配的的左括号。如果该括号与之对应(即小括号匹配小括号,中括号匹配中括号),则将二者配对。如果左侧未匹配的左括号不存在或与之不对应,则其配对失败。
配对结束后,对于 中全部未配对的括号,请你在其旁边添加一个字符,使得该括号和新加的括号匹配。
如:
输入1:()为配对,([未配对
([()
输出1:
()[]()
输入2:全部未配对
([)
输出2:
()[]()
输入3:[()]为配对,(未配对
([()]
输出3:
()[()]
输入4:全部配对
([()])
输出4:
([()])
输入
输入只有一行一个字符串,表示 。
输出
输出一行一个字符串表示你的答案。
样例输入 复制
([()
样例输出 复制
()[]()
提示
数据规模与约定
对于全部的测试点,保证 的长度不超过 100,且只含 (
,)
,[
,]
四个字符。
#include<bits/stdc++.h> using namespace std; struct point { char c; int pos; }; int main(){ string s; stack<point> p_s; bool mark[105]={0}; cin >> s; for (int i=0;i<s.size();i++) { if (s[i]=='('||s[i]=='[') { p_s.push({s[i],i}); continue; } if (p_s.empty()) continue; point p=p_s.top(); if (s[i]==')'&&p.c=='('||s[i]==']'&&p.c=='[') { mark[i]=1; mark[p.pos]=1; p_s.pop(); } } for (int i=0;i<s.size();i++) { if (mark[i]) cout<<s[i]; else if(s[i]=='('||s[i]==')') cout<<"()"; else if(s[i]=='['||s[i]==']') cout<<"[]"; } return 0; }