小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为m|S,例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?
输入描述:
输入第一行包含一个字符串s,代表压缩后的字符串。
S的长度<=1000;
S仅包含大写字母、[、]、|;
解压后的字符串长度不超过100000;
压缩递归层数不超过10层;
输出描述:
输出一个字符串,代表解压后的字符串。
输入例子1:
HG[3|B[2|CA]]F
输出例子1:
HGBCACABCACABCACAF
例子说明1:
HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF
方法1:调用正则包re,由内往外解析即可,几行代码就解决咯
import re
word = input()#HG[3|B[2|CA]]F
while '|' in word:
for code in re.findall('\[[0-9]+\|[A-Z]+\]', word):
info = re.findall('\[(.*?)\|(.*?)\]', code)[0]
word = word.replace(code, info[1]*int(info[0]))
print(word)
方法2:不调用re,直接上手,也是依照从内向外的方式解析(略麻烦!)
def decode(code):
a = code.index('[')
b = code.index('|')
c = code.index(']')
num = int(code[a+1:b])
val = code[b+1:c]
return val*num
def split(code):
left = [[i,'['] for i in range(len(code)) if code[i]=='[']
right = [[i,']'] for i in range(len(code)) if code[i]==']']
kuo = left+right
kuo.sort()
kuo_xu = ''
kuo_va = []
for i in kuo:
kuo_va.append(i[0])
kuo_xu += i[1]
loca = kuo_xu.index('[]')
b = code[kuo_va[loca]:kuo_va[loca+1]+1]
c = decode(b)
code = code.replace(b, c)
return code
code = input()#HG[3|B[2|CA]]F
for i in range(code.count('[')):
code = split(code)
print(code)
由于是笔试,当然首选re啦!