题面:
输入:
输出:
基本测试用例:
思路:
这道题是真的恶心啊,因为本蒟蒻脑子不太好,从32分一路改改改,改到100,期间参考过题解,也尝试过使用栈进行解题,奈何还是错露摆出,最后只能回归最开始做的思路,放弃栈,改用数组进行标记进行解题
这道题的难点之一是题目意思是真的难懂,语文水平太过低下,从题面来看,其实对于一个字符串从左到右历遍,出现右括号的,则需要找到此括号的左边最近的相对应的括号(原对原,中对中),找到了则两者配对,如果找不到则配对失败。然后在我们输出字符串时,需要对未匹配的括号进行补全(缺左补左,缺右补右),已配对的则直接输出就行。
那么现在看来是不是题目很简单呢,在理清题目后就可以着手进行写出代码,我们可以沿用我们对题目理解出来的思路,即历遍字符串,如遇到右括号则向左寻找对应的左括号,找到了则用一个bool类型数组记录,表示已经匹配了括号,然后同理一直历遍到字符串末尾,然后再历遍一次,根据bool数组里面提供的匹配信息知道该如何输出。
代码如下
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
bool b[101];
int main()
{
memset(b,false,sizeof(b));
string str;
cin>>str;//输入字符串
for(int i=0;i<str.length();i++)//开始第一次历遍
{
//对字符串内容进行匹配
//分两种情况,一种是遇见')'另一种是']'
if(str[i]==')')
{
for(int j=i;j>=0;j--)
{
//这个&&后面的条件是为了防止重复对着一个相同的字符匹配
if(str[j]=='('&&b[j]==false)
{
b[i]=b[j]=true;
break;
}
else
if(str[j]=='['&&b[j]==false)
{
break;
}
}
}
else
if(str[i]==']')
{
for(int j=i;j>=0;j--)
{
if(str[j]=='['&&b[j]==false)
{
b[i]=b[j]=true;
break;
}
else
if(str[j]=='('&&b[j]==false)
{
break;
}
}
}
}
for(int i=0;i<str.length();i++)//第二次历遍
{
if(b[i]==true)//当为真时,说明此字符已经被匹配
{
//输出原字符就行
cout<<str[i];
}else
{
//当为假时,说明没被匹配,然后根据是什么括号进行输出就行
if(str[i]=='('||str[i]==')')
cout<<"()";
else
cout<<"[]";
}
}
return 0;
}
好了,这题到这里就结束了。