题目描述:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
附上一个更详细的解答,也是本文学习的方法:
重要思想:
栈需要存储两个信息,一个是左括号前面的字符s,一个是左括号前面的数字num。
触发他们出栈的条件是——当有新的字符串被检测到,且检测到了末尾标志——“ ] ”,这时候就要在s的基础上,去拼接num倍的新字符串。
代码实现:
class Solution:
def decodeString(self, string: str) -> str:
# 辅助栈,每项存储两个信息,一个左括号前面的字符,一个左括号前面的数字
stack = []
# 用于数字真实值的计算
num = 0
# 用于存储在解码过程中产生的字符串
s = ''
for char in string:
# 当字符是数字
if char.isdigit(): # 可能不仅仅有一位
num = num * 10 + int(char) # 通过一串连续的数字字符推理出数字的值
# 遇到左括号时,将前面的字符和数值入栈
elif char == '[':
stack.append((s, num))
# 这里要重置存储这两项的变量!!!已经存储在栈中不必要担心数据丢失
s = ''
num = 0
# 遇到右括号时,出栈
elif char == ']':
# 括号匹配的就近原则 栈顶的s、num(定义为front_char, cur_num)先出栈
front_char, cur_num = stack.pop()
# 解码
s = front_char + cur_num * s
# 遇到字符
else:
s = s + char
return s
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self): # 返回最后一个元素
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
举个例子模拟程序运行:
2[abc]3[cd]ef
step 1: 计算得到 num = 2
step2:遇到[,存储('',2)
step3:得到 s = abc
step4:遇到],运算数字加字符串,即为解码过程:得到abcabc,字符串变为abcabc3[cd]ef
step5:计算得到 num = 3
step6:遇到[, 存储(‘abcabc’,3)
step7:得到 s = cd
step8: 遇到],运算数字加字符串,即为解码过程:得到abcabccdcdcd
step9:添加到s后面 得到abcabccdcdcdef
step10:遍历结束 return s