LeetCode 394 字串解碼

2021-10-08 01:40:30 字數 3252 閱讀 2545

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

編碼規則為: 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 為 [ 時,將當前multires入棧,並分別置空置 0:

1)記錄此[前的臨時結果res至棧,用於發現對應]後的拼接操作;

2)記錄此[前的倍數multi至棧,用於發現對應]後,獲取multi × [...]字串。

3)進入到新[後,resmulti重新記錄。

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 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...