leetcode 394 字串解碼

2021-10-05 18:22:49 字數 1521 閱讀 7372

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

編碼規則為: 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"

.

思路:

構建輔助棧 stack, 遍歷字串 s 中每個字元 c;

1.當 c 為數字時,將數字字元轉化為數字 multi,用於後續倍數計算;

2.當 c 為字母時,在 res 尾部新增 c;

3.當 c 為 『[』 時,將當前 multi 和 res 入棧,並分別置空置 0.

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

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

3)進入到新 『[』 後,res 和 multi 重新記錄。

當 c 為 『]』 時,stack 出棧,拼接字串 res = last_res + cur_multi * res,其中:

last_res是上個 [ 到當前 [ 的字串,例如 「3[a2[c]]」 中的 a;

cur_multi是當前 [ 到 ] 內字串的重複倍數,例如 「3[a2[c]]」 中的 2。

返回字串 res

例如3[a2[c]],演算法過程:

1.首先 res為空,第乙個字元為3,則repeattime=3,再向後為』[』,於是入棧(3,"").同時,res置空,repeattimes置為0.

2.遍歷a res=『a。

3.遍歷到2,repeattime=2.

4.遍歷到』[』,入棧(2,「a」),同時,res置空,repeattimes置為0.

5.遍歷到c,res=c。

6.遍歷到』]』,出棧,棧頂元素為(2,「a」),則res=「a」+res2=acc.

7.遍歷到『]』,出棧,棧頂元素為(3,""),則res=」「+res3=accaccacc

8.返回res。

ac**:(c++)

class

solution

return res;

} string decodestring

(string s)

else

if(i ==

']')

else

res +

= i;

}return res;}}

;

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