解压报文 Python
为了提升数据传输的效率,会对传输的报文进行压缩处理。输入一个压缩后的报文,请返回它解压后的原始报文。
压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
输入压缩后的报文:
1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
2)原始报文不包含数字,所有的数字只表示重复的次数 n,例如不会出现像 5b 或 3[8] 的输入;
输出描述:
解压后的原始报文
示例1 输入 3[k]2[mn] 输出 kkkmnmn
说明 k 重复3次,mn 重复2次,最终得到 kkkmnmn
示例2 输入 3[m2[c]] 输出 mccmccmcc
说明
m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc”
def DecodeStr(encode_str: str):
stack = []
rep_num = []
rep_text = []
for c in encode_str:
if c == "]":
# "]"不能入栈
# 可以确定的是,第一个"]"的左边字符,肯定是字母,处理字母
rep_text = []
while len(stack) > 0 and stack[-1] != "[":
rep_text.append(stack.pop())
rep_text = rep_text[::-1]
# 该弹出"["的时候,开始处理数字
if len(stack) > 0 and stack[-1] == "[":
stack.pop()
while len(stack) > 0 and "0" <= stack[-1] <= "9":
rep_num.append(stack.pop())
rep_num = rep_num[::-1]
rep_num = int("".join(rep_num))
# 解码最内层
stack.extend(rep_text * rep_num)
# 清零重复数,准备解码下一层
rep_num = []
else:
stack.append(c)
return "".join(stack)
assert (
DecodeStr("3[m10[cd]]")
== "mcdcdcdcdcdcdcdcdcdcdmcdcdcdcdcdcdcdcdcdcdmcdcdcdcdcdcdcdcdcdcd"
)
assert DecodeStr("3[m2[c]]") == "mccmccmcc"
assert DecodeStr("10[k]12[mn]") == "kkkkkkkkkkmnmnmnmnmnmnmnmnmnmnmnmn"
#华为OD##括号匹配#
SHEIN希音公司福利 363人发布