描述
给出一个字符串,该字符串仅由小写字母组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。给出多个字符串,计算每个字符串最大可能的“漂亮度”。
本题含有多组数据。
数据范围:输入的名字长度满足 1≤�≤10000 1≤n≤10000
输入描述:
第一行一个整数N,接下来N行每行一个字符串
输出描述:
每个字符串可能的最大漂亮程度
示例1
输入:
2 zhangsan lisi输出:
192 101说明:
对于样例lisi,让i的漂亮度为26,l的漂亮度为25,s的漂亮度为24,lisi的漂亮度为25+26+24+26=101.
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
for (int i=0; i<a; i++) {
String s = in.nextLine();
while (s.equals("")) {
s = in.nextLine();
}
System.out.println(getRes(s));
}
}
}
public static int getRes(String s) {
char[] chs = s.toCharArray();
int sum = 0;
Map<Character, Integer> map = new HashMap<>();
List<Obj> list = new ArrayList<>();
for (char ch : chs) {
if (map.containsKey(ch)) {
Obj o = list.get(map.get(ch));
o.add(1);
}
else {
map.put(ch, list.size());
list.add(Obj.build(ch, 1, list.size()));
}
}
Comparator<Obj> comp = new Comparator<Obj>() {
public int compare(Obj o1, Obj o2) {
if (o1.count != o2.count) {
return o2.count-o1.count;
}
else {
return o1.index - o2.index;
}
}
};
Collections.sort(list, comp);
Map<Character, Integer> valMap = new HashMap<>();
int val = 26;
for (Obj o : list) {
valMap.put(o.ch, val);
val--;
}
for (int i=0; i<chs.length; i++) {
char ch = chs[i];
sum += valMap.get(ch);
}
return sum;
}
public static class Obj {
char ch;
int count;
int index;
public static Obj build(char ch, int count, int index) {
Obj o = new Obj();
o.ch = ch;
o.count = count;
o.index = index;
return o;
}
public void add(int i) {
this.count += i;
}
}
}