题目描述
有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮 助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一 串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压 缩密码,外星人对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。现 在我们给你外星人发送的密码,请你对其进行解压缩。
输入格式
第一行:一个字符串
输出格式
第一行:一个字符串
输入输出样例
输入 #1复制
AC[3FUN]
输出 #1复制
ACFUNFUNFUN
说明/提示
【数据范围】
对于 50%的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。
对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。 对于 100%的数据:保证只包含数字、大写字母、’[‘和’]‘
分析:
说实话,看到这道提高题我是慌的,因为我以为会是那种很烧脑的题目,没想到,居然是这种巨麻烦无比但是不难的题目,就是要注意各种细节,一不小心就可能wa
对于一个字符串,记录下其第一个'['和最后一个']',然后记录下第一个'['的字串prestr和对应的的']'之后的字串laststr,prestr不会在含有递归式子(因为他在第一个'['之前!),中间的字串和最后一个字串会含有递归,然后合并就是所要求的答案
注意几点,一个就是第一个'['对应的']'之后,还可能有含'[]'的字串,另一个就是会有两个'[]'并行的情况,都要特别注意,其他的就没什么
附上AC代码:
#include<iostream>
#include<stack>
#include<string>
#include<math.h>
using namespace std;
stack<char> s;
string str1;
string dealwithstr(string str);
int main()
{
cin>>str1;
cout<<dealwithstr(str1);
return 0;
}
string dealwithstr(string str)
{
int begin=99999,end;
int flag=0;
int count=0;
string tempstr;
string restr;
string finialstr;
string prestr,laststr;
int numlen=0;
int first=1;
for(int i=0;i<=str.size()-1;i++)
{
if(str[i]=='[')
{
flag=1;
s.push(str[i]);
if(first)
{
begin=i;
for(int j=begin+1;'0'<=str[j]&&str[j]<='9';j++)
{
//cout<<"helo"<<endl;
numlen++;
}
//cout<<"numlen "<<numlen<<endl;
for(int j=begin+numlen;j>=begin+1;j--)
{
int temp=(int)(str[j]-'0');
//cout<<"temp "<<temp<<endl;
//cout<<"pow "<<(int)(pow(10,begin+numlen-j))<<endl;
count+=temp*((int)(pow(10,begin+numlen-j)));
}
//cout<<"count "<<count<<endl;
first=0;
}
}
else if(str[i]==']')
{
s.pop();
if(s.empty())
{
end=i;
break;
}
}
}
//cout<<"count "<<count<<endl;
if(flag==0)
return str;
for(int i=0;i<=begin-1;i++)
prestr+=str[i];
//cout<<"hi"<<endl;
if((end+1)<=str.size()-1)
{
string substr=str.substr(end+1,str.size()-1);
//cout<<substr<<endl;
laststr=dealwithstr(substr);
}
//for(int i=end+1;i<=str.size()-1;i++)
//laststr+=str[i];
for(int i=begin+numlen+1;i<=end-1;i++)
{
tempstr+=str[i];
}
restr=dealwithstr(tempstr);
for(int i=1;i<=count;i++)
finialstr+=restr;
return prestr+finialstr+laststr;
}