解压报文 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##括号匹配#