题目描述
请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述:
一行输出最短的编码后长度。
输入例子:
MT-TECH-TEAM
输出例子:
33
//哈夫曼编码
public class Main {
private static int solve(String str) {
if (str.length() == 0) {
return 0;
}
int length = str.length();
char[] chs = str.toCharArray();
int[] arr = new int[256];
for (int i = 0; i < length; i++) {
++arr[chs[i]];
}
PriorityQueue<Integer> prioArr = new PriorityQueue<>(length);
int result = 0;
for (int i = 0; i < 256; i++) {
if (arr[i] != 0) {
prioArr.add(arr[i]);
}
}
while (prioArr.size() > 1) {
int x = prioArr.poll();
int y = prioArr.poll();
int sum = x + y;
prioArr.add(sum);
result += sum;
}
return result;
}
public static void main(String[] arg) {
Scanner scan = new Scanner(System.in);
while (scan.hasNext()) {
String str= scan.nextLine();
System.out.println(solve(str));
}
scan.close();
}
}