題目: 哈夫曼編碼大全
描述:
關於哈夫曼樹的建立,編碼,解碼。
輸入
第一行輸入數字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;
}
}
|