打败算法 —— 字符串解码

本文参考

出自LeetCode上的题库 —— 字符串解码,本题仍然是栈相关的操作

https://leetcode-cn.com/problems/decode-string/

字符串解码问题

给定一个经过编码的字符串,返回它解码后的字符串
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 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"

解题思路

因为有可能存在嵌套的情况,所以不能通过简单的遍历来实现字符串的解码。本题可以用栈来暂存前面碰到的数字和字母,其关键在于解决三个问题:

"遍历字符串时,遇到 [ 应该做什么?"
"遍历字符串时,遇到 ] 应该做什么?"
"应该向栈中压入什么?"
"什么时候从栈里弹出元素?"

问题一:因为 [ 前的数字不一定是个位数,有可能是两位数或三位数,所以碰到第一个数字时,不一定就是我们需要重复的次数,直到遇到 [ 才能确定 k 的值
问题二:遇到 ] 代表前面已经读入了重复次数 k 和应当被重复的字母字符串,所以可以执行解码操作
问题三:重复次数 k 和读到 k 之前的字母字符串
问题四:遇到 ] 时弹出栈顶元素

栈解法

class Solution:
  def decode_string(self, s: str) -> str:
    stack = list()
    mul = ''
    ans = ''
    for c in s:
      # 数字 

      if re.match(r'[0-9]', c):
        mul += c
      # 左括号,将数字压入栈 

      elif c == '[':
        stack.append((mul, ans))
        mul = ''
        ans = ''
      # 字母 

      elif re.match(r'[a-z]', c):
        ans += c
      # 右括号弹出 

      elif c == ']':
        top: tuple = stack.pop()
        ans = top[1] + ans * int(top[0])
    return ans

posted @ 2022-03-11 15:31  咕~咕咕  阅读(71)  评论(0编辑  收藏  举报