[编程题]压缩算法
[编程题]压缩算法
腾讯后端校招题目
链接:https://www.nowcoder.com/questionTerminal/c27561e5b7e0441493adb9a54071888d
来源:牛客网
热度指数:9198时间限制:C/C++ 2秒,其他语言4秒空间限制:C/C++ 256M,其他语言512M
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
输入描述:
- 输入第一行包含一个字符串s,代表压缩后的字符串。
- S的长度<=1000;
- S仅包含大写字母、[、]、|;
- 解压后的字符串长度不超过100000;
- 压缩递归层数不超过10层;
输出描述:
输出一个字符串,代表解压后的字符串。
示例1
输入
HG[3|B[2|CA]]F
输出
HGBCACABCACABCACAF
说明
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF
First Try
2020-10-08
其实就是类似js里面的flattern array的操作,但是这是字符串,需要一个字符一个字符的扫描过去。遇到[号表示开始新的征程,遇到]表示可以退回上一层,然后使用相同的index进行追踪,直到完成整个字符串。一开始以为根本不需要|标记,但如果考虑到重复次数可能是100次这种三个数字的,不使用正则表达式的话还是需要通过|来进行标记了。
扫了一眼题解,有的人是先扫描完一遍字符找到所有标记之后再进行处理的,感觉还是现在这种一次扫描的更高端一些。
txt = input().strip()
def unpack(txt, lft):
rv = ''
while lft < len(txt):
if txt[lft] == '[':
t = lft
while txt[lft] != "|":
lft += 1
times = int(txt[t + 1: lft])
lft, content = unpack(txt, lft + 1)
rv += times * content
elif txt[lft] ==']':
return lft + 1, rv
else:
rv += txt[lft]
lft += 1
return lft, rv
_, rv = unpack(txt, 0)
print(rv)