1. 程式人生 > 其它 >【LeetCode】394. 字串解碼

【LeetCode】394. 字串解碼

394. 字串解碼

知識點:字串;棧

題目描述

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

編碼規則為: 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"


解法一:棧

這道題目裡有括號的巢狀,其實應該可以想到棧的;
對於這種巢狀的,我們只能先把裡面的展開,然後再展開外面的,所以後入的先出,這不就是棧嗎?
其次要思考,入棧的是什麼,可以把左括號的位置入棧,然後遇到右括號出棧,在這個匹配的位置上就是要展開的字母,除此之外,還需要將之前的字母也入棧,因為要乘以這個次數
然後可以用新的字串去替換之前的字串,然後接著遍歷,這是一種方法;
數字是肯定要入棧的,那可不可以把左括號之前,也就是排好的字串和數字一起入棧,這個排好的字元其實就相當於是上一個字元,
然後遇到右括號後只需要把這個上一個字串和現在的字串(也就是當前括號裡的字串)拼接在一起就可以了,這層完了之後,再去取下一層棧的就可以了

class Solution:
    def decodeString(self, s: str) -> str:
        stack, res, num = [], '', 0
        for cur_s in s:
            if cur_s == '[':
                stack.append([num, res])  # 壓入棧的是重複的數字和左括號之前的排好的字串,例如例2裡的a
                res, num = '', 0  # 壓入後需要統計現在新的了,所以都清空
            elif cur_s == ']':
                cur_num, last_res = stack.pop()
                res = last_res + cur_num*res  # res始終都是壓入棧後剩餘的字串,也就是括號裡的
            elif '0' <= cur_s <= '9':
                num = 10*num + int(cur_s)  #這種寫法也要學會
            else:
                res += cur_s
        return res