题目可以转换为:输入一个字符串,每个字符对应一个分值,求字符串的最大总分值;
由于题目并没有限制某个字符对应某个分值,因此可以应用贪心的思想,即将最高分值赋给出现次数最多的字符;
因此问题的解决方案为:
对字符串进行桶排序,我们只需要知道不同字符出现的次数,甚至都不需要知道次数对应的是什么字符;
然后再将次数降序排列,依次乘以当前还可以用的最高分值再加入总分值
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
while ((s = br.readLine()) != null) {
int[] counter = new int[26];
for(char c: s.toCharArray()) {
counter[c-'a']++;
}
List<Integer> list = new ArrayList<>();
for(int n: counter) {
if (n > 0) {
list.add(n);
}
}
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i2.intValue() - i1.intValue();
}
});
int point = 26, sum = 0;
for(int i = 0; i < list.size(); i++) {
sum += (point - i) * list.get(i).intValue();
}
System.out.println(sum);
}
br.close();
}
}
京公网安备 11010502036488号