給定乙個經過編碼的字串,返回它解碼後的字串。
編碼規則為: 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 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...