题目可以转换为:输入一个字符串,每个字符对应一个分值,求字符串的最大总分值;
由于题目并没有限制某个字符对应某个分值,因此可以应用贪心的思想,即将最高分值赋给出现次数最多的字符;
因此问题的解决方案为:
对字符串进行桶排序,我们只需要知道不同字符出现的次数,甚至都不需要知道次数对应的是什么字符;
然后再将次数降序排列,依次乘以当前还可以用的最高分值再加入总分值
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(); } }