給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。
你可以認爲輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認爲原始數據不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。
這道題是高頻題,從括號匹配角度看,是棧的典型應用,字符串中可能出現的字符共有四種:字母,數字字符,左括號,右括號,分別對幾種情況進行討論,首先需要定義一個棧來存儲臨時數字和字符串,
class Solution:
def decodeString(self, s: str) -> str:
# use stack to solve the string decode
stack = [] # 定義棧
res = '' # 定義臨時字符串
multi = 0 # 定義遞增倍數
for c in s: # 對給定字符串中每一個字符進行循環判斷
if c == '[': # 當出現左括號時,此時將臨時字符和乘數作爲數組壓入棧
stack.append([multi, res])
multi, res = 0, '' # 同時需要置位0,以進行循環
elif c == ']': # 當出現右括號時,說明此時的臨時字符串已經爲最近的【】內字符了
cur_multi, last_res = stack.pop() # 彈出保存的臨時變量,可以發現此時彈出的最近字符串即爲乘完之後的剩餘字符串,因爲前後關係,此時的乘數即爲當前乘數,
res = last_res + cur_multi * res # 更新res臨時變量
elif '0' <= c <= '9': # 判斷是否爲數字字符,保存
multi = multi * 10 + int(c)
else: # 如果爲字符,簡單相加存儲臨時變量即可
res += c
return res