[LeetCode]394. 字符串解碼

題目

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

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

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

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

示例:

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

解題思路

創建兩個輔助棧,一個爲字符棧str_stack,另一個爲數字棧num_stack。從左到右遍歷原始字符串:
1)如果遇到的是數字,注意可能是連續多位的數字,就計算重複的次數 num;
2)如果遇到一個左括號,就將之前已經解碼的字符串 preres 加入字符棧,將重複次數 num 加入數字棧,入棧之後將res和重複次數清零;
3)如果遇到普通字符,就將它加入當前遍歷的字符串 res 末尾;
3)如果遇到一個右括號,代表括號內的字符串已經遍歷完畢,那麼從字符棧中彈出之前已經解碼的字符串,以及當前括號內的字符串的重複次數,進行拼接 res = str_stack.pop() + num_stack.pop() * res。

複雜度分析:
時間複雜度:記解碼後得出的字符串長度爲 S,除了遍歷一次原字符串 s,我們還需要將解碼後的字符串中的每個字符都入棧,並最終拼接進答案中,故漸進時間複雜度爲 O(S+|s|),即 O(S)。
空間複雜度:記解碼後得出的字符串長度爲 S,這裏用棧維護 TOKEN,棧的總大小最終與 S 相同,故漸進空間複雜度爲 O(S)。

代碼

class Solution:
    def decodeString(self, s: str) -> str:
        res = ''
        str_stack = []
        num_stack = []
        num = 0
        for c in s:
            # 如果是數字,注意可能不止一位
            if c.isdigit():
                num = num*10 + int(c)
            # 遇到左括號開始入棧
            elif c == '[':
                # 先將之前已經解碼的字符串入棧
                str_stack.append(res)
                # 將數字倍數入棧
                num_stack.append(num)
                # 入棧後清零
                res = ''
                num = 0
            # 遇到右括號開始出棧
            elif c == ']':
                res = str_stack.pop() + num_stack.pop() * res
            # 如果是字符
            else:
                res += c
        return res
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章