题目: 哈夫曼编码大全 描述: 关于哈夫曼树的建立,编码,解码。 输入 第一行输入数字N,代表总共有多少个字符以及权值 第二第三行分别是一行字符串,以及每个字符对应的权值 接下来输入一个数M,表示接下来有M行字符串,要求你对每个字符串进行编码 再输入一个数X,表示接下来有X行编码,要求你对每行编码进行解码 输出 第一行输出所有节点的权重 接下来输出N行,每行以 “a:001”的格式输出每个字符对应的编码 接着输出M行,对输入的字符串的编码结果 最后,输出X行的解码结果 输入样例 6 abcdef 50 10 5 5 20 10 2 abcdef defabaabbc 2 011001100100110110101101100 1100011000110101100101100 输出样例 50 10 5 5 20 10 10 20 30 50 100 a:0000 b:100 c:1100 d:1101 e:111 f:101 010011001101111101 11011111010100001001001100 accbdfadb cacadacfb 在stringbuffer和string比较中出现bug 经过查找,用stringbuffer的tostring方法,然后再和string equals package easyProgram;
import java.util.Scanner;
public class HuffmanAll {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i , j, temp,min1=0,min2=0;
int n = sc.nextInt();//总字符数
String str = sc.nextLine();//去除换行
str = sc.nextLine();
N[] p = new N[2*n];
for(i=1;i<=n;i++)
{
p[i] = new N(sc.nextInt());
}
//建树
for(j=n+1;j<2*n;j++)
{
for(i=1;i<j;i++)
{
if(p[i].parent == 0)
{
min1 = i;
break;
}
}
i++;
for(;i<j;i++)
{
if(p[i].parent == 0 )
{
min2 = i ;
break;
}
}
if(p[min1].weight>p[min2].weight)
{
temp = min1;
min1 = min2;
min2 = temp;
}
i++;
for(;i<j;i++)
{
if(p[i].parent == 0)
{
if(p[i].weight<p[min1].weight)
{
//注意要先修改min2的值
min2 = min1;
min1 = i;
}
else if(p[i].weight<p[min2].weight)
{
min2 = i;
}
}
}
p[j] = new N(p[min1].weight+p[min2].weight);
p[j].left = min1;
p[j].right = min2;
p[min1].parent = j;
p[min2].parent = j;
}
//输出所有的权重
for(i=1;i<2*n;i++)
{
System.out.print(p[i].weight+" ");
}
System.out.println();
StringBuffer[] ss = new StringBuffer[n];
for(i=1;i<=n;i++)
{
ss[i-1] = print(p,i);//调用print方法
System.out.println(str.charAt(i-1)+":"+ss[i-1]);
}
int m = sc.nextInt();//接下来m行要编码的字符串
String s = sc.nextLine();//去除换行
while(m--!=0)
{
s = sc.nextLine();
for(i = 0;i<s.length();i++)
{
System.out.print(ss[str.indexOf(s.charAt(i))]);
}
System.out.println();
}
int c = sc.nextInt();
s=sc.nextLine();
while(c--!=0)
{
s = sc.nextLine();
// System.out.println("in");
for(i = 0;i<s.length();i++)
{
for(j=0;j<n;j++)
{
if(i+ss[j].length()>=s.length())
{
if(ss[j].toString().equals(s.substring(i)))
{
System.out.print(str.charAt(j));
i=i+ss[j].length()-1;
break;
}
}
else
{
if(ss[j].toString().equals(s.substring(i,i+ss[j].length())))
{
System.out.print(str.charAt(j));
i=i+ss[j].length()-1;
break;
}
}
}
}
System.out.println();
}
}
//注意这里的递归。
private static StringBuffer print(N[] p, int i) {
StringBuffer s = new StringBuffer("");
if(p[i].parent ==0 )
return s;
int ch = p[i].parent;
s.append(print(p,ch));
if(p[ch].left == i)
s.append("0");
else
s.append("1");
return s;
}
}
class N{
int left;
int right;
int parent;
int weight;
public N(int weight)
{
this.weight = weight;
left = 0 ;
right = 0;
parent=0;
}
}
|