解题思路:首先题目要求是给一个字符串,然后展开。展开是将[ ]内的字符串进行展开,而且展开的次数是,[ ]前的数字。大体思路有了以后进行细化。一个字符串它可以[ ]里面包着很多[ ],我们可以对最里面的[ ]的字符串进行展开。例如:3[2[ad]3[pf]]xyz,先对最里面的字符串进行展开,得到3[adadpfpfpf]xyz,然后在展开得到adadpfpfpfadadpfpfpfadadpfpfpfxyz。
解题过程:给定一个字符串s,定义一个字符串a,利用atoi判断s的某个字符是否是数字。利用while语句,条件是s的长度不为0,然后从s第一个字符开始判断,若该字符不是数字,则将该字符加到a的末尾。否则,利用atoi将该字符或多个字符转化成数字num,stringsteam将该数字转化成字符串,求得该数字位数,然后从s的第一位字符期删除相应数量的字符,然后将[ ]内的字符赋值给新的字符串aa,并且在s中删除相应字符串。aa内可能会有[],所以对aa进行递归。然后将aa递归结果赋值给b,然后将b加到字符串a后面num次。最后返回a.
代码实现:string expressionExpand(string &s){
string a;
while(s.length())\\s长度不为0
{
int num=atoi(s.c_str());\\判断s的第一位是不是数字。
stringstream ss;
ss<<num;
string b=ss.str();\\求得数字长度
if(num||(b.length()==1&&s[0]=='0'))\\s的前几位是数字的情况
{
s.erase(0,1+b.length())\\删除s的前几位数字以及数字后面的‘[‘符号。
int count=1;
string aa;
while(1)
{
if(s[0]=='[')
{
count++;
}
else if(s[0]==']')
{
count--;
}
if(count==0) break;
else{
aa+=s[0];
s.erase(0,1);
}
}\\将s的[ ]内字符串赋值给aa
b=expressionExpand(aa);\\aa进行递归,并将结果给b
while(num)\\对b进行扩展
{
a+=b;
num--;
}
}
else{\\若s的首位不是数字的话,就直接将字符加到a后面,并且删除该字符
if(s[0]!='['&&s[0]!=']') a+=s[0];
s.erase(0,1);
}
}
return a;
}
注意事项:要注意字符串的用法,尤其是删除操作,string转化int操作,而且思路要清晰。而且要注意字符串内0是字符,转化后还是0,但是此时要对0后面括号内的字符展开0次,但是若该字符不是数字,转化得到的也是0,但此时不对后面字符展开,而且该字符后面也没有括号[],这里需要注意。
个人总结:我在字符串是0的那个地方栽了一次,没想到那点上去。