对于给定由小写字母构成的字符串,定义字符串的“漂亮度”为该字符串中所有字母“漂亮度”的总和。 每一个字母的“漂亮度”将由你来确定,具体规则如下: 每一个字母的“漂亮度”为 1 到 26 之间的整数; 没有两个字母的“漂亮度”相同。 现在,你需要确定每个字母的“漂亮度”,以使得字符串的“漂亮度”最大。
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤ T≤ 10) 代表数据组数,每组测试数据描述如下: 在一行上输入一个长度为 1 ≤ len(s) ≤ 10^4 、仅由小写字母构成的字符串 s 。
对于每一组测试数据,输出一个整数,表示字符串的最大“漂亮度”。
2 zhangsan lisi
192 101
考点:字符串 · 贪心
数据规模 T ≤ 10 | 限制 1 秒 / 32MB | 标准输入输出
推荐方向:贪心
每一步都取当前最优,靠问题性质保证局部最优能拼成全局最优。
思路框架(贪心 通法 · 非本题专属)
实现要点:贪心题关键在于排序规则:按什么关键字排序决定了策略是否正确。
复杂度:时间 O(n log n)(含排序) | 空间 O(1) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 2 / zhangsan / lisi → 输出 192 / 101
对于第一组测试数据,其中一种最优的分配方案是:
将字符 `a' 的漂亮度分配为 26 ;
将字符 `n' 的漂亮度分配为 25 ;
将字符 g', z', h', s' 的漂亮度依次分配为 24 21 ;
其余字符随意分配;
最终,得到字符串的“漂亮度”为 (26 + 25) × 2 + (24 + 23 + 22 + 21) = 192 。
对于第二组测试数据,其中一种最优的分配方案是:
将字符 `i' 的漂亮度分配为 26 ;
将字符 `l' 的漂亮度分配为 25 ;
将字符 `s' 的漂亮度分配为 24 ;
其余字符随意分配;
最终,得到字符串的“漂亮度”为 26 × 2 + (25 + 24) = 101 。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:华为机试编程模拟题10。