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