Leetcode之Decode String

題目:

Given an encoded string, return its decoded string.

The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.

Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4].

Examples:

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

代碼:

方法一——遞歸法:

class Solution {
public:
    string decodeString(string s) {
        int i = 0;
        return decode(s, i);
    }
    string decode(string s, int& i) {
        string res = "";
        int n = s.size();
        while (i < n && s[i] != ']') {
            if (s[i] < '0' || s[i] > '9') {
                res += s[i++];
            } else {
                int cnt = 0;
                while (s[i] >= '0' && s[i] <= '9') {
                    cnt = cnt * 10 + s[i++] - '0';
                }
                ++i;
                string t = decode(s, i);
                ++i;
                while (cnt-- > 0) {
                    res += t;
                }
            }
        }
        return res;
    }
};

思路:調用一個遞歸函數decode進行對s的解析,在左括號前的一定是數字,根據這一點。如果遇到了字母,直接加到結果中,如果遇到了數字,記錄這個數字,然後++i跳過左括號,進行下一步解析,對下一步解析的結果進行數字n的循環加到結果中。然後++i,跳過右括號。解析函數中的while循環結條件是i<n且s[i]不是右括號。每一步循環的解析結果會返回第一個右括號前的解析。瞭解理解這個流程。

方法二——迭代法:

class Solution {
public:
    string decodeString(string s) {
        string t = "";
        stack<int> s_num;
        stack<string> s_str;
        int cnt = 0;
        for (int i = 0; i < s.size(); ++i) {
            if (s[i] >= '0' && s[i] <= '9') {
                cnt = 10 * cnt + s[i] - '0';
            } else if (s[i] == '[') {
                s_num.push(cnt);
                s_str.push(t);
                cnt = 0; t.clear();
            } else if (s[i] == ']') {
                int k = s_num.top(); s_num.pop();
                for (int j = 0; j < k; ++j) s_str.top() += t;
                t = s_str.top(); s_str.pop();
            } else {
                t += s[i];
            }
        }
        return s_str.empty() ? t : s_str.top();
    }
};

思路:使用兩個棧 ,一個是數字棧,一個是字符串棧,對s進行遍歷,當遇到了數字,另cnt等於數字;當遇到了左括號,將數字和字符串存到棧中,數字和字符串清零;當遇到了右括號,取棧頂的數字k,給棧頂的字符串進行對於t的k次疊加,然後令t等於字符串棧頂的字符串;當遇到字母,直接往t上加。最後返回的時候,如果字符串棧爲空,那麼返回t,如果字符串棧不是空,那麼返回棧頂的字符串。

 

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