美团点评2016研发工程师编程题(二)
请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
输入描述:
每组数据一行,为待编码的字符串。保证字符串长度小于等于1000。
输出描述:
一行输出最短的编码后长度。
输入例子:
MT-TECH-TEAM
输出例子:
33
分析:哈夫曼编码的过程,用一个最小堆实现,将当前最小的两个数取出来,求和后继续推入堆中。
代码:
- #include <iostream>
- #include <queue>
- #include <algorithm>
- #include <functional>
- #include <string>
- using namespace std;
- int main() {
- string s;
- while (getline(cin, s)) {
- int ret=0;
- int n = s.size();
- sort(s.begin(), s.end());
- int cnt = 0;
- priority_queue<int, vector<int>, greater<int> > heap;
- for (int i = 0, j; i < n;) {
- j = i;
- while (j < n && s[j] == s[i]) ++j;
- heap.push(j - i);
- i = j;
- ++cnt;
- }
- for (int i = 0; i < cnt-1; i++) {
- int a = heap.top();
- heap.pop();
- int b = heap.top();
- heap.pop();
- heap.push(a+b);
- ret += a + b;
-
-
- }
- cout << ret << endl;
-
- }
- return 0;
- }
- #include<map>
- #include<iostream>
- #include<string>
- using namespace std;
- struct BTreeNode
- {
- int weight;