7-5 括号匹配 (10 分)
请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出Match;如不匹配,计算出使该序列变为匹配序列所需添加的最少括号数目(只允许在该序列开始和结尾处添加括号),并输出经添加最少括号后得到的合法匹配序列。
输入格式:
输入为若干行,每行一个字符串,包含不超过10
5
个括号。输入行数不超过10行。
输出格式:
对于输入的每个括号序列输出1行或2行信息。若输入的括号序列匹配,则输出Match。若不匹配,则输出分为2行,第1行为一个整数,表示将该序列变为匹配序列所需添加的最少括号数目,第2行为一个字符串,表示经添加最少括号后得到的合法匹配序列。
输入样例:
(())()
)(
()))((
输出样例:
Match
2
()()
4
((()))(())
思路:记录多出来的( 和)的个数 ,在两边输出 补齐的)和( 在中间输出 原始字符串
代码:
#include <iostream>
using namespace std;
char a[110000]; ///由题可知 所给字符串中只有(),所以结果只出现 ( 或) 或 )( 或 全匹配 四种情况
int main() ///并且当不匹配时,需要输出字符串中所有字符匹配之后的结果
{ ///如所给样例 ()))(( 输出结果为 ((()))(()) 可知我们只需要补齐整个字符串左边缺少的(
while(cin>>a) ///和右边缺少的 ) 那门我们只需要记录 缺少的( 以及)的个数 ,也就是 记录 多出来的 ) 和( 的个数
{
int l,r; /// 所以用l存放(的个数 r 存放) 的个数 ,当现在存在(时 出现) 那么l-- ,当不存在( 出现) 那么l++
l=r=0;
for(int i=0;a[i]!=0;i++)
{
if(a[i]=='(')
l++;
else
{
if(l==0)
r++;
else
l--;
}
}
if(l==0&&r==0)
cout<<"Match"<<endl;
else
{
cout<<l+r<<endl;
for(int i=0;i<r;i++)
cout<<'(';
cout<<a;
for(int i=0;i<l;i++)
cout<<')';
cout<<endl;
}
}
return 0;
}
202204152257五