1. 程式人生 > >LeetCode 字串解碼 堆疊應用

LeetCode 字串解碼 堆疊應用

背景:資料結構中的堆疊在以往的工作和學校裡都沒有怎麼用過,但是這個演算法如果在需要的場合中使用能夠發揮非常大的作用,下面是一個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,再拼接後邊的模組。

方法是,遇到'['就執行一次壓棧,然後遇到']'就進行一次出棧構造,拼接不需要多重構造的字串,繼續流程


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
這個演算法能實現O(n)的時間複雜度,還是能夠滿足題目的要求的。