栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python算法】:压缩

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python算法】:压缩

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444337.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号