算法题 - 解压字符串 - Python

解压字符串

问题描述:

现在有一种字符串的压缩规则是这样的:k[string],表示string连续出现k(0 < k < 1000)
比如:s = "ef3[a]2[bc]gh", 解压后的字符串为:"efaaabcbcgh",这种压缩也可以相互嵌套:s = "3[a2[c]]", 解压后为:"accaccacc"

  • 输入一个压缩的字符串s,请输出解压后的字符串。
  • 输入都是严格合法的,数字只用来表示重复次数,不会出现3a 或者2[4]这样的输入。
  • 解压后的字符串只有字母

问题分析:

刚刚的一个测验题,比较尴尬的是,出现了一个丢人的bug浪费了很长时间,现在总结一下:

(1)用递归,就比较麻烦了,还是用栈操作比较好,简单易懂。具体思路:

(2)挨个遍历输出,如果出现[ 则进入一个临时栈里面,并且计数一次,接下来继续入栈,直到出现]出栈,然后继续判断,,,,(不说了看代码吧)

Python3实现:

# @Time   :2019/01/31
# @Author :LiuYinxing
# 栈操作


class Solution:
    def unZipString(self, S):
        res, stack, cnt = '', [], 0

        for s in S:

            if cnt == 0:  # 没有出现括号的情况,直接输出
                if s != '[':
                    res += s
                else:
                    stack.append(s)
                    cnt += 1
                continue

            if cnt > 0:   # 有括号的情况
                if s == '[':
                    stack.append(s)
                    cnt += 1
                elif s == ']':  # 此时要出栈
                    cnt -= 1
                    tmp = stack.pop()
                    while tmp[0] != '[':
                        tmp = stack.pop() + tmp

                    tmp = tmp[1:]  # 把第一个字符去掉

                    if cnt == 0:
                        n = int(res[-1])
                        res = res[:-1]
                        res += n * tmp
                    else:
                        n = int(stack.pop())
                        stack.append(n * tmp)
                else:  # 其他情况
                    stack.append(s)

        return res



if __name__ == '__main__':
    solu = Solution()
    S = 'ef3[a]2[bc]gh'
    # S = '3[a2[c]]'
    print(solu.unZipString(S))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接: 今天的一个公司的在线笔试题

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/86718507