完美字符串

本文介绍了一种算法,用于计算字符串的最大可能完美度。通过统计字符出现次数并按降序分配完美度值,最终求和得到最大完美度。
       字符串的完美度等于它里面所有字母的完美度之和。每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数。 字母不分大小写,也就是说字母F和f的完美度相同。
       给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串完美度为77。

分析:
       (1)由于每个字母的完美度可以自由分配,那么要得到最大的完美度,显然字符串中数量越多的字母分配的完美度分值就应该越大。
        (2)只需要统计出字符串包含的各个字母的数量,按照从大到小排序,再依次将完美度值从大到小进行赋值,最后得到的必然是最大完美度。
       看代码:
s = input().lower()
cs = 'abcdefghijklmnopqrstuvwxyz'
cd = sorted([[c, s.count(c)] for c in cs], key=lambda x: x[1], reverse=True)
print(sum([x[1] * v for x, v in zip(cd, range(26, 0, -1))]))
       1)先将输入字符串s统一转换成小写;
       2)构建26个字母构成的序列cs;
       3)通过列表推导式 [[cs.count(c)] for in cs] 构建一个字母和该字母在s中数量对应关系的列表,然后通过sorted内置排序函数通过各字母数量进行降序排序;
       4)通过列表推导式和zip结合 [x[1] * v for xin zip(cdrange(260-1))]
,将字母,字母在s中数量,相应的完美度值进行匹配组合,构成一个完美度值的新序列,然后用sum()函数进行完美度求和并输出。

       测试用例: EYBQTBTKQJ
       输出结果:236
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值