2020-05-28 LeetCode 394 字符串解碼 C++

題目:

 給定一個經過編碼的字符串,返回它解碼後的字符串。

 編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。

 你可以認爲輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

 此外,你可以認爲原始數據不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

 之前做過一個括號匹配的問題,這種類型的題目一般都是要壓棧的,最開始的思路是如果遇到 ‘]’,就在棧中找到第一個匹配的 ‘[’,將二者之間的字符連接起來,再將 '[‘前面的數字連接起來作爲重複次數再次壓棧,遇到’['和其他字符都直接壓棧,最後將棧裏的字符串連接起來就是結果。

 考慮到機試的問題,決定以後的代碼都用C++或者C寫了,做題的過程順便複習(預習)C++,所以這次復現的時候有的地方不知道咋寫就看了其他人的代碼,後來看到一個特別好的復現https://leetcode-cn.com/problems/decode-string/solution/zhi-xing-yong-shi-0-ms-zai-suo-you-c-ti-jiao-zh-47/,就照着這個寫了,這個代碼最主要的優化是用vector代替stack和遇到 ']‘後不是把解碼的字符串全部壓進棧,而是暫時放在ans中存儲,也省去了’['的查找時間,i了i了。

 看了之後自己仿照寫了個代碼,差不多是默寫了

class Solution {
public:
    typedef pair<int,string>  pis;
    string repeat(string s,int times){
        string repeatS="";
        for(int i=0;i<times;i++){
            repeatS+=s;
        }
        return repeatS;
    }

    string decodeString(string s) {
        string ans="";
        int times=0;
        vector<pis> vecStack;
        for(auto i:s){
            if('0'<=i&&i<='9')
                times=times*10+(i-'0');
            else if(i=='['){
                vecStack.push_back({times,ans});
                times=0;
                ans="";
            }
            else if(i==']'){
                pis tmp=vecStack[vecStack.size()-1];
                vecStack.pop_back();
                ans=tmp.second+repeat(ans,tmp.first);
            }
            else
                ans+=i;
        }
        return ans;
    }
};

 運行結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章