給定乙個經過編碼的字串,返回它解碼後的字串。
編碼規則為: 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"
2.1 輔助棧法
本題難點在於括號內巢狀括號,需要從內向外生成與拼接字串,這與棧的先入後出特性對應。
演算法流程:
一、構建輔助棧stack
, 遍歷字串 s 中每個字元 c;
當 c 為數字時,將數字字元轉化為數字 multi,用於後續倍數計算;
當 c 為字母時,在 res 尾部新增 c;
當 c 為 [ 時,將當前multi
和res
入棧,並分別置空置 0:
1)記錄此[
前的臨時結果res
至棧,用於發現對應]
後的拼接操作;
2)記錄此[
前的倍數multi
至棧,用於發現對應]
後,獲取multi × [...]
字串。
3)進入到新[
後,res
和multi
重新記錄。
當c
為]
時,stack
出棧,拼接字串res = last_res + cur_multi * res
,其中:
1)last_res
是上個[
到當前[
的字串,例如"3[a2[c]]"
中的a
;
2)cur_multi
是當前 [ 到 ] 內字串的重複倍數,例如"3[a2[c]]"
中的2
。
二、返回字串 res。
class
solution
:def
decodestring
(self, s:
str)
->
str:
stack, res, multi =
,"",0
for c in s:
if c ==
'[':
[multi, res]
) res, multi ="",
0elif c ==
']':
cur_multi, last_res = stack.pop(
) res = last_res + cur_multi * res
elif
'0'<= c <=
'9':
multi = multi *10+
int(c)
else
: res += c
return res
複雜度分析:
時間複雜度 o(n),一次遍歷 s;
空間複雜度o(n),輔助棧在極端情況下需要線性空間,例如2[2[2[a]]]
。
2.2 遞迴法
總體思路與輔助棧法一致,不同點在於將[
和]
分別作為遞迴的開啟與終止條件:
當s[i] == ']'
時,返回當前括號內記錄的res
字串與 ] 的索引i
(更新上層遞迴指標位置);
當s[i] == '['
時,開啟新一層遞迴,記錄此[...]
內字串tmp
和遞迴後的最新索引i
,並執行res + multi * tmp
拼接字串。
遍歷完畢後返回res
。
class
solution
:def
decodestring
(self, s:
str)
->
str:
defdfs
(s, i)
: res, multi ="",
0while i <
len(s):if
'0'<= s[i]
<=
'9':
multi = multi *10+
int(s[i]
)elif s[i]
=='['
: i, tmp = dfs(s, i +1)
res += multi * tmp
multi =
0elif s[i]
==']'
:return i, res
else
: res += s[i]
i +=
1return res
return dfs(s,
0)
複雜度分析:
時間複雜度 o(n),遞迴會更新索引,因此實際上還是一次遍歷 s;
空間複雜度 o(n),極端情況下遞迴深度將會達到線性級別。
leetcode題解
Leetcode 394 字串解碼
給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不包...
LeetCode 394 字串解碼
給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...
LeetCode 394 字串解碼
給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...