LeetCode 字串解碼 堆疊應用
阿新 • • 發佈:2019-01-28
背景:資料結構中的堆疊在以往的工作和學校裡都沒有怎麼用過,但是這個演算法如果在需要的場合中使用能夠發揮非常大的作用,下面是一個LeetCode中的題目和解法。
題目:
給定一個經過編碼的字串,返回它解碼後的字串。
編碼規則為: 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"
解析:
需要從最深的括號入手進行構造,逐層向上拼接並繼續構造,最終組合成字串。考慮到堆疊的特性是後來先處理,因此用堆疊實現任務記錄,然後就能從最深的任務開始執行並向上遞迴,最終實現構造。
以"a3[b4[df]]f2[cv]"為例進行分析:
首先是處理"4[df]"然後是和"b"拼接,然後構造後拼接a,再拼接後邊的模組。
方法是,遇到'['就執行一次壓棧,然後遇到']'就進行一次出棧構造,拼接不需要多重構造的字串,繼續流程
這個演算法能實現O(n)的時間複雜度,還是能夠滿足題目的要求的。class Solution: def decodeString(self, s): """ :type s: str :rtype: str """ tempIntStr = '' tempStr = '' tempIntStack = [] tempStrStack = [] reStr = '' bisn = False for c in s: if c.isnumeric() and bisn: tempIntStr += c elif c == '[': tempIntStack.insert(0, tempIntStr) tempIntStr = '' tempStrStack.insert(0, '') bisn = False elif c == ']': if len(tempStr) > 0: tempStrStack[0] = tempStrStack[0] + tempStr tempStr = '' ts = tempStrStack[0] del tempStrStack[0] ti = int(tempIntStack[0]) del tempIntStack[0] tss = '' for i in range(ti): tss += ts if len(tempStrStack) == 0: reStr += tss else: tempStrStack[0] = tempStrStack[0] + tss elif c.isnumeric() and not bisn: tempIntStr += c if len(tempIntStack) == 0: reStr += tempStr else: tempStrStack[0] = tempStrStack[0] + tempStr tempStr = '' bisn = True else: tempStr += c reStr += tempStr return reStr