Leetcode 394.字符串解码(Decode String)

Leetcode 394.字符串解码

1 题目描述(Leetcode题目链接

  给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k [ e n c o d e d _ s t r i n g ] k[encoded\_string] ,表示其中方括号内部的 e n c o d e d _ s t r i n g 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".

2 题解

  根据题目分析,我的第一想法是用栈来做,需要对各种情况思考得仔细一些,写起来貌似还有些麻烦。

class Solution:
    def decodeString(self, s: str) -> str:
        stack = []
        retv = ""
        num = 0
        for char in s:
            print(stack)
            if not stack and char.isalpha():
                retv += char
            elif char.isdigit():
                num = num*10 + int(char)
            elif char == '[':
                stack.append(num)
                stack.append(char)
                num = 0
            elif stack and char.isalpha():
                if stack[-1].isalpha():
                    stack[-1] += char
                else:
                    stack.append(char)
            elif char == ']':
                seq = stack.pop()
                stack.pop()
                times = stack.pop()
                seq = seq*times
                if not stack:
                    retv += seq
                    continue
                if stack[-1] != '[':
                    stack[-1] += seq
                else:
                    stack.append(seq)
        return retv

也可以用递归来做。

class Solution:
    def decodeString(self, s: str) -> str:

        def dfs(s, i):
            retv = ""
            num = 0
            while i < len(s):
                if s[i].isalpha():
                    retv += s[i]
                elif s[i].isdigit():
                    num = num*10 + int(s[i])
                elif s[i] == '[':
                    target, i = dfs(s, i+1)
                    retv += num*target
                    num = 0
                elif s[i] == ']':
                    return retv, i
                i += 1
            return retv
        return dfs(s, 0)

排名靠前的题解如下。

class Solution:
    def decodeString(self, s: str) -> str:

        res = ""
        stk = []
        cnt = ""
        for ch in s:
            if ch == '[':
                stk.append([int(cnt), ""])
                cnt = ""
            elif ch == ']':
                cur_res = stk.pop()
                if stk:
                    stk[-1][1] += cur_res[0] * cur_res[1]
                else:
                    res += cur_res[0] * cur_res[1]
            elif '0' <= ch <= '9':
                cnt += ch
            else:
                if stk:
                    stk[-1][1] += ch
                else:
                    res += ch

        return res
发布了264 篇原创文章 · 获赞 63 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39378221/article/details/104992493