1. 程式人生 > 其它 >Leetcode 字串解碼

Leetcode 字串解碼

字串解碼

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

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

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

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

示例 1:

輸入:s = "3[a]2[bc]"
輸出:"aaabcbc"

示例 2:

輸入:s = "3[a2[c]]"
輸出:"accaccacc"

示例 3:

輸入:s = "2[abc]3[cd]ef"
輸出:"abcabccdcdcdef"

示例 4:

輸入:s = "abc3[cd]xyz"
輸出:"abccdcdcdxyz"

這道題可能是我最近花的時間最多的一道題。題目不是特別難。但是總是通不過測試,曾經一度懷疑是題目出現了一個問題。原來是我的答案後面多了一個空格。

這道題的思路和逆波蘭計算器的思路類似,我看到網上很多人的答案用了兩個棧,一個儲存數字,一個儲存字母。但是,我覺得用一個棧就足夠了。思路大致是我們從左到右一直讀取字串,如果不是']'的話,直接入棧。如果是']'。我們需要另作分析。

我們遇到']',繼續讀取,直到遇到了'[',我們在這[ , ]之間構造出一個字串,然後繼續讀取前面的數字。對字串進行疊加。然後在入棧。直到遍歷到最後。最後,棧裡面儲存的就是答案的逆序。我們將其取出構造一個字串,然後將其逆序。這就是大概思路。為了方便,我直接使用了c++封裝的algorithm裡的reverse方法。如果方便,也可以自己寫一個逆序的函式。

class Solution {
public:
    bool isNum(char s){
        //判斷是否為數字
        if(s>='0'&& s<='9')
            return true;
        return false;
    }
    string decodeString(string s) {
        //利用棧來處理,類似於逆波蘭演算法
        int index = 0;
        string ans = "";
        stack<char> MyStack;
		MyStack.push(s[index++]);
        while(index<=s.size()){
            if(MyStack.top()==']'){
				MyStack.pop();
                string str = "";
                string last = "";
                while(MyStack.top()!='['){
                    str += MyStack.top();
                    MyStack.pop();
                }
                MyStack.pop();
                string num;
                int n = 0;
                while(MyStack.top()>='0'&&MyStack.top()<='9'){
                    num += MyStack.top();
                    MyStack.pop();
                    if(MyStack.empty())
                        break;
                }
                reverse(num.begin(),num.end());
                n = atoi(num.c_str());
                for(int i=0;i<n;i++){
                    last += str;
                }
                reverse(last.begin(),last.end());
                for(char i:last){
                    MyStack.push(i);
                }
			}
			else
				MyStack.push(s[index++]);
        }
        while(!MyStack.empty()){
            ans += MyStack.top();
            MyStack.pop();
        }
        reverse(ans.begin(),ans.end());
        ans.pop_back();
        return ans;
    }
};
執行用時:0 ms , 在所有 C++ 提交中擊敗了100.00% 的使用者
記憶體消耗:6.3 MB
, 在所有 C++ 提交中擊敗了76.48%的使用者
通過測試用例:
34 / 34