LintCode-分治-Expression Expand

来源:互联网 发布:oracle12c新建数据库 编辑:程序博客网 时间:2024/06/06 08:27

点此直接进入题目

解题思路:首先题目要求是给一个字符串,然后展开。展开是将[ ]内的字符串进行展开,而且展开的次数是,[ ]前的数字。大体思路有了以后进行细化。一个字符串它可以[ ]里面包着很多[ ],我们可以对最里面的[ ]的字符串进行展开。例如:3[2[ad]3[pf]]xyz,先对最里面的字符串进行展开,得到3[adadpfpfpf]xyz,然后在展开得到adadpfpfpfadadpfpfpfadadpfpfpfxyz

解题过程:给定一个字符串s,定义一个字符串a,利用atoi判断s的某个字符是否是数字。利用while语句,条件是s的长度不为0,然后从s第一个字符开始判断,若该字符不是数字,则将该字符加到a的末尾。否则,利用atoi将该字符或多个字符转化成数字numstringsteam将该数字转化成字符串,求得该数字位数,然后从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的那个地方栽了一次,没想到那点上去。