LeetCode 字串解碼

2021-09-24 21:22:57 字數 1416 閱讀 2218

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

編碼規則為:k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。

你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像3a2[4]的輸入。

示例:

s = "3[a]2[bc]", 返回 "aaabcbc".

s = "3[a2[c]]", 返回 "accaccacc".

s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

其實像這種括號題,很容易就能想到要用棧,但是想到用棧還是不夠的,因為有巢狀的問題需要再考慮,然後我就寫了乙個極其麻煩的**,不是這裡錯就是那裡錯的那種,最後還是看了大佬的**,才知道,考慮巢狀的同時,也需要先認為連續的字元和單個字元在本題中,屬於完全相同的東西,那麼,長短字元就沒與區別了,解決乙個問題,那麼要怎麼解決巢狀的問題呢?想了好久,後來看了大佬的**才知道,左括號也要入棧,這樣就能與右括號作為一對成對的開關,這本應該是極其簡單的思路,但是卻因為想了太多怎麼才能省略操作,然後我從一開始就沒有把左括號入棧,導致後面全部都做不對,不過看到這裡,其實也會發現,其實長字元就算是拆開成單個字元進行儲存其實也是可以的,並不影響。

class solution:

def decodestring(self, s: str) -> str:

stack =

res = ''

for i, _s in enumerate(s):

if _s != ']': # 不是右括號就一直進棧

else:

string = '' # 先收集要加倍的字串

while not stack[-1].isnumeric():

string = stack.pop()+string

times = '' # 再收集加倍倍數

while stack and stack[-1].isnumeric():

times = stack.pop()+times

if times: # 如果有倍數則加倍

string = string[1:]*int(times)

if stack: # 還有沒處理完的上級,把處理好的字串入棧等待處理

else: # 前面的字串處理完畢了,直接把字串加入答案

res += string

return res+''.join(stack) # 最後可能有沒有右括號收尾的字串

1. leetcode: 

2. leetcode-題解:

leetcode 字串解碼

給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...

LeetCode 字串解碼(棧輔助)

給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...

字串解碼

給定乙個經過編碼的字串,返回它解碼後的字串。編碼規則為 k encoded string 表示其中方括號內部的 encoded string 正好重複 k 次。注意 k 保證為正整數。你可以認為輸入字串總是有效的 輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。此外,你可以認為原始資料不...