題目
給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: k[encoded_string]
,表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。
你可以認爲輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認爲原始數據不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a
或 2[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