【文字列処理】力ボタン394


タイトルの説明:符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、k[encoded_string]であり、カッコ内のencoded_を表すstringはちょうどk回繰り返します.注意kは正の整数であることを保証する.
入力文字列は常に有効であると考えられます.入力文字列には余分なスペースがなく、入力した四角カッコは常にフォーマットの要件を満たしています.
また、元のデータには数字は含まれておらず、すべての数字は重複回数kのみを表し、例えば3 aや2[4]のような入力は現れないと考えられます.
例:s="3[a]2[bc],は"aaabcbc"を返す.s="3[a 2[c]",は"accaccacc"を返す.s=「2[abc]3[cd]ef」で、「abcabccdcdef」を返します.
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/decode-string著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
プリシールコード
class Solution {
     
public:
    string gs;
    int pos;
    int getdigit(){
     
        int ans=0;
        while(pos<gs.size()&&isdigit(gs[pos])) ans=ans*10+gs[pos++]-'0';// 
        return ans;
    }
    string getstring(){
     
        if(pos==gs.size()||gs[pos]==']') return "";
        string res="";
        int tmp;
        int i;
        string tmps;
        if(isalpha(gs[pos])) res=res+gs[pos++];// 
        else{
     
            tmp=getdigit();// 
            pos++;// 
            tmps=getstring();// 
            pos++;// 
            for(i=0;i<tmp;i++) res=res+tmps;// 
        }
        return res+getstring();// , —— , ; , 
    }
    string decodeString(string s) {
     
        gs=s;
        pos=0;
        return getstring();
    }
};

注釈:素朴な問題で、答えに倣っていくつかの細部を処理し、書かれたコードを処理しました.大体の構想は、目標列gsに沿って後に読んで、数字を読んで数字で処理して、アルファベットの部分を読んで再帰的に処理して、1つの']'の部分を読むたびに数字で1ラウンドコピーして、それからこの列に戻ります;
isdigitとisalphaの2つの関数は初めて出会って、勉強します;
再帰処理文字列は、頭がはっきりしていて、どの文字がどのように処理されているのか、再帰の原則は何なのかを読んでいます.これらの問題をしっかり把握して解決した.