题目描述:给定一个字符串(长度不超过100),求哈夫曼编码的最短长度。
输入1:
abbcccdddd
输出1:
19
输入2:
we will we will r u
输出2:
50
求解代码:
#include <iostream>
#include <string>
#include <queue>
#include <map>
#include <vector>
using namespace std;
const int maxn = 110;
map<char, int> m;//存放各字符出现的次数
priority_queue<int, vector<int>, greater<int> > q;//使用优先队列模拟求解过程
int main() {
string s;
getline(cin, s);
//统计各字符出现的次数
for (int i = 0; i < s.length(); i++) {
m[s[i]]++;
}
//遍历,将各字符出现的次数存入优先队列中
map<char, int>::iterator it;
for (it = m.begin(); it != m.end(); it++) {
q.push(it->second);
}
int ans = 0,sum=0;//ans存放哈夫曼树的非根结点权值之和(即所求问题的答案)
while (q.size()>=2) {//优先队列先弹出最小的两个数,将这两个数的和再放入优先队列中
sum = q.top();
q.pop();
sum += q.top();
q.pop();
q.push(sum);
ans += sum;
}
cout << ans << endl;//输出结果
return 0;
}