↓快轉到主要內容
  1. LeetCode/

LeetCode 394: Decode String

·1 分鐘· ·
LeetCode Medium Stack String Recursion
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2025-10-08

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

k[encoded] 可以巢狀,例如 3[a2[c]]。這是典型的 stack 題:

  • 遇到 [:把「目前累積的字串」和「這個括號的次數」推進 stack,開始累積括號裡面的字串。
  • 遇到 ]:括號裡面的字串累積完了,取出上一層的字串和次數,組合成 上一層 + 這一層 * 次數。

我的第一版:假設次數只有一位數
#

stack.pop()                       # 彈出 "["
repeat_time = int(stack.pop())    # 只取了一個字元當次數

第一版把每個字元都推進 stack,遇到 ] 時往回彈到 [。問題是次數只彈了一個字元,10[a] 就會被當成 0[a]。第二版改成一直彈到不是數字為止,就 AC 了。

正確解法
#

class Solution:
    def decodeString(self, s: str) -> str:
        stack = []
        cur, num = "", 0
        for ch in s:
            if ch.isdigit():
                num = num * 10 + int(ch)
            elif ch == "[":
                stack.append((cur, num))
                cur, num = "", 0
            elif ch == "]":
                prev, k = stack.pop()
                cur = prev + cur * k
            else:
                cur += ch
        return cur

stack 裡存的是「上一層的字串和次數」,而不是一個一個字元,這樣遇到 ] 時不用往回找 [,也不用把字元重新拼起來。

複雜度
#

時間 O(輸出長度),空間 O(輸出長度)。

要特別避免的錯誤
#

  • 假設次數只有一位數。
  • 把每個字元都推進 stack,遇到 ] 時再往回拼:可以 AC,但比較慢也比較容易出錯。

面試口說整理
#

我用 stack 處理巢狀的括號:遇到數字就累加次數(可能有好幾位),遇到 [ 就把目前的字串和次數推進 stack 並重新開始,遇到 ] 就彈出上一層的字串和次數,把這一層重複次數後接到上一層後面。最後累積的字串就是答案,時間和輸出長度成正比。

相關文章

LeetCode 3703: Remove K-Balanced Substrings
·2 分鐘
LeetCode Medium Stack String Simulation
LeetCode 3703 解題筆記:反覆 replace 是 O(n^2);stack 存 (字元, 連續個數),湊到 k 個 ( 加 k 個 ) 就整段消掉
LeetCode 402: Remove K Digits
·1 分鐘
LeetCode Medium String Stack Greedy Monotonic-Stack
LeetCode 402 解題筆記:單調遞增 stack,遇到比頂端小的數字就把頂端刪掉(還有 k 次可刪時),最後去掉前導零
LeetCode 227: Basic Calculator II
·1 分鐘
LeetCode Medium Math String Stack
LeetCode 227 解題筆記:先把數字讀完整,遇到運算子時處理上一個運算子:+ - 把數放進 stack(減號放負數),* / 直接跟頂端算
LeetCode 143: Reorder List
·1 分鐘
LeetCode Medium Linked-List Two-Pointers Stack Recursion
LeetCode 143 解題筆記:找中點、反轉後半段、兩條交錯合併;前半段的尾巴要切斷
LeetCode 71: Simplify Path
·1 分鐘
LeetCode Medium String Stack
LeetCode 71 解題筆記:用 / 切開,空字串和 . 跳過,.. 就 pop(根目錄不能再往上),其他名稱 push,最後用 / 接起來
LeetCode 2487: Remove Nodes From Linked List
·1 分鐘
LeetCode Medium Linked-List Stack Recursion Monotonic-Stack
LeetCode 2487 解題筆記:保留的節點從左到右是非遞增的;用單調棧,比新節點小的都彈掉,最後把棧裡的節點串起來