首页 > 试题广场 >

字符编码

[编程题]字符编码
  • 热度指数:5118 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。

数据范围:字符串长度满足 ,本题有多组输入

输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。


输出描述:
一行输出最短的编码后长度。
示例1

输入

MT-TECH-TEAM

输出

33
没啥耐心,变量名用的比较混乱。
import sys

a = []
for line in sys.stdin:
    a += line.split()
    
result = []
for item in a:
    temp = []
    hashmap = {}
    # 字典转列表然后升序排序
    for code in list(item):
        if code in hashmap:
            hashmap[code] += 1
        else:
            hashmap[code] = 1
    temp += sorted(hashmap.items(), key=lambda s: s[1])

    # 列表转字典,并清空权重
    b = temp.copy()
    for i in range(len(b)):
        b[i] = (b[i][0],0)
    b = dict(zip([x[0] for x in b], [x[1] for x in b]))

    # temp:value升序的元组列表
    # b:1权重字典
    def search(kv):
    # 输入元组列表,输出最小元组
        min = kv[0][1]
        char = kv[0][0]
        index = 0
        for i in range(len(kv)):
            if kv[i][1]<= min:
                min = kv[i][1]
                char = kv[i][0]
                index = i
        kv.pop(index)
        return min, char
        
    def hfm():
        #哈夫曼树主体,选择value最小的节点,
        while len(temp) != 1:
            t1,c1 = search(temp)
            t2,c2 = search(temp)
            for any in c1:
                b[any] += 1
            for any in c2:
                b[any] += 1
            temp.append((c1+c2,t1+t2))
    
    hfm()

    # 此时b是树权重字典
    count = 0
    for code in list(item):
        count += b[code]
    print(count)


发表于 2023-04-05 21:26:28 回复(0)

热门推荐

通过挑战的用户

查看代码