打败算法 —— 字符串解码
本文参考
出自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