python: 2020算法笔试题目-压缩算法

小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啦!

发布了20 篇原创文章 · 获赞 3 · 访问量 1491

猜你喜欢

转载自blog.csdn.net/qq_42830966/article/details/105349964