點此直接進入題目
解題思路:首先題目要求是給一個字元串,然後展開。展開是将[ ]内的字元串進行展開,而且展開的次數是,[ ]前的數字。大體思路有了以後進行細化。一個字元串它可以[ ]裡面包着很多[ ],我們可以對最裡面的[ ]的字元串進行展開。例如: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的那個地方栽了一次,沒想到那點上去。