leetcode(394). Decode String

problem

Given an encoded string, return it’s decoded string.

The encoding rule is: k[encoded_string], where the encoded_string
inside the square brackets is being repeated exactly k times. Note
that k is guaranteed to be a positive integer.

You may assume that the input string is always valid; No extra white
spaces, square brackets are well-formed, etc.

Furthermore, you may assume that the original data does not contain
any digits and that digits are only for those repeat numbers, k. For
example, there won’t be input like 3a or 2[4].

Examples:

s = “3[a]2[bc]”, return “aaabcbc”.
s = “3[a2[c]]”, return “accaccacc”.
s = “2[abc]3[cd]ef”, return “abcabccdcdcdef”.

分析

这个问题其实和只有加法乘法和括号的表达式求值差不多,对于嵌套的括号我是从外向内展开计算的,这样的方式虽然易于理解但是代码量大,且效率慢(因为需要多次展开计算)。

这种带嵌套括号的问题通常有两种解法,一种是使用栈,还有一种是逐层展开。下面是从外向内展开的代码:

# 超过了2%
from string import digits

def decodeDig(s):
    #处理形如'999[..[..]...]'
    res = ''
    d = ''
    for i, str in enumerate(s):
        if str in digits:
            d += str
        else:
            res = s[i+1:-1]*int(d)
            return res


def decode(string):
    #decode用来处理形如'xxx999[..[..]...]'的字符串
    res = ''
    for i, s in enumerate(string):
        if s in digits:
            res += decodeDig(string[i:])
            break
        else:
            res += s
    return res



class Solution(object):
    def decodeString(self, s):
        """
        :type s: str
        :rtype: str
        """
        def dec(s):
            ans = ''
            start = 0
            flag = 0
            for i, str in enumerate(s):
                if str == '[':
                    flag += 1
                elif str == ']':
                    flag -= 1
                    if flag == 0:
                        ans += decode(s[start:i+1])
                        start = i+1
            if start != len(s):
                ans += s[start:]
            return ans

        while ']' in s:
            s = dec(s)
        return s

使用栈

使用栈可以从内向外计算。

class Solution(object):
    def decodeString(self, s):
        stack = []
        stack.append(["", 1])
        num = ""
        for ch in s:
            if ch.isdigit():
              num += ch
            elif ch == '[':
                stack.append(["", int(num)])
                num = ""
            elif ch == ']':
                st, k = stack.pop()
                stack[-1][0] += st*k
            else:
                stack[-1][0] += ch
        return stack[0][0]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值