1. 程式人生 > >Leetcode_394_ Decode String_dfs搜尋_我的演算法之路_解密字串

Leetcode_394_ Decode String_dfs搜尋_我的演算法之路_解密字串

在這個題目中,在給定3[a]2[bc]這種形式的字串,我們需要來解密這個字串,即用遞迴的思想來做下面是我的程式碼

class Solution {
public:
    string decodeString(string s) {
        string res;
        for(int i=0;i<s.size();)//首先對字串的每一個字元進行列舉
        {
            if(!isdigit(s[i])) res+=s[i++];//用到isdigit函式來判斷該字元是不是1-9的數字,如果不是將字元加到答案中,這其中有一個陷阱,就是滿足if語句之後,執行關係式res+=[i++]用完i才能進行++的自加運算,進入到else語句則不行。
            else
            {
                int k=0;
                while(isdigit(s[i])) k=k*10+s[i++]-'0';//此語句常用來計算字串中數字字元的大小,減去‘0’是因為ascii碼將字元數字轉換成數字字元。 
                int j=i+1,sum=1;//這其中涉及到了括號序列的問題,設定一個暫存器,當遇到左括號為加1遇到右括號為減一,當sum值為0是,開始的左括號與為0的右括號匹配。
                while(sum>0)
                {
                    if(s[j]=='[') sum++;
                    if(s[j]==']') sum--;
                    j++;
                }//此時j移動到了與開始左括號所匹配的右括號的下一位。
                string r=decodeString(s.substr(i+1,j-i-2));//如果內部巢狀一個k規則,則遞迴到下一層來進行運算,即下一層的字串長度為j-i-2,從i+1位開始,在次用到了substr函式。
                while(k--) res+=r;//然後就用k*所遞迴出來的字串。注意語句在哪個括號內
                i=j;
            }    
        }
         return res;//for迴圈執行完畢,然後返回結果。
    }
};

加油加油!!!