LeetCode——0394.字符串解码

394.字符串解码

题目

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

 

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

1>源代码

class Solution:
    def decodeString(self, s: str) -> str:
        result = ''
        string_stack = []
        data = 0
        for i in s:
            if(i.isdigit()):
                data = data*10 + int(i)

            elif(i == '['):
                string_stack.append([data, result])
                result = ''
                data = 0

            elif(i.isalpha()):
                result += i

            elif(i == ']'):
                result = string_stack[-1][1] + string_stack[-1][0] * result
                string_stack.pop()
        return result

2>算法介绍

最难受的事情莫过于,我知道这道题肯定需要用栈来完成,但是在草稿纸上模拟了20分钟还是没能找出正确的算法…所以最终我选择的是LeetCode官方解答视频中的算法。在遍历字符串的时候会遇到以下几种情形:

  1. 当前为字符’a’-‘z’:我们使用临时字符串result来保存检测到的字符;
  2. 当前为数字字符’0’-‘9’:由于可以出现’1’'2’两个数字字符连续出现的情形,所以我们使用data来保存临时数字字符,如果遇到连续出现数字字符的情况,则通过移位来保存其值;
  3. 当前为’[’:我们将此时的data值与临时字符串result构成列表[data, result]压栈。由于此时的临时变量已经压栈保存,所以别忘了将临时字符串result清空,将临时data清零;
  4. 当前为’]’:我们将栈顶元素出栈,由于栈顶元素为[data, result]的列表,我们举一个例子来理解一下栈顶元素该怎么使用:
输入:
2[a]

根据前面的算法思路,当扫描到’]‘的时候,栈的情况为[[2, ‘’]],临时字符串result = ‘a’。所以我们的结果应该是 result = 2 * ‘’ + ‘a’ = ‘aa’。所以当扫描到’]'时:

        result = string_stack[-1][1] + string_stack[-1][0] * result
        string_stack.pop()

这样我们的问题就迎刃而解了!


方法二 递归

class Solution:
    def decodeString(self, s: str) -> str:
        def dfs(s, i):
            res, multi = "", 0
            while i < len(s):
                if '0' <= s[i] <= '9':
                    multi = multi * 10 + int(s[i])
                elif s[i] == '[':
                    i, tmp = dfs(s, i + 1)
                    res += multi * tmp
                    multi = 0
                elif s[i] == ']':
                    return i, res
                else:
                    res += s[i]
                i += 1
            return res
        return dfs(s,0)


# 作者:jyd
# 链接:https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

递归法看到之后也是恍然大悟,从题目特征的角度来说,我也想到过用递归,但是我在思考的时候没有找到很好的递归返回条件。这里则是将’[‘作为递归开始条件,将’]'作为递归返回条件,还是非常巧妙的方法,值得我学习。

你可能感兴趣的:(LeetCode训练,leetcode,python,字符串,算法)