1 回答
TA贡献1719条经验 获得超6个赞
程序的问题是解码方式错误:您获取第一个霍夫曼代码,将所有出现的内容替换为给定的字符串,然后对下一个霍夫曼代码进行相同的操作,依此类推。
那不是解码霍夫曼编码的字符串的方式。为了解码霍夫曼编码的字符串,您需要检查该字符串的前缀是否与某些霍夫曼代码相同。这是通过将字符串的前缀与霍夫曼代码一一比较来完成的。
你的情况:
迭代1:10101011001100111101100111111011000011011010000
我们检查000-不是一个前缀
,我们检查001-不是一个前缀
,我们检查010-不是一个前缀
,我们检查011-不是一个前缀
,我们检查1000-不是一个前缀
,我们检查1001-不是一个前缀
,我们检查1010-发现了一个前缀!它对应于字母h
现在我们从原始字符串中删除此前缀,因此我们的字符串是
1011001100111101100111111011000011011010000
迭代2:1011001100111101100111111011000011011010000
合适的前缀1011是字母e
迭代3:001100111101100111111011000011011010000
合适的前缀001是字母y
迭代4:100111101100111111011000011011010000
合适的前缀1001是空格字符
依此类推,直到原始字符串中没有剩下的为止。
修改后的代码如下所示:
while(st.length() > 0)
{
for(int i_map = 0; i_map < charCodeArrayList.size(); i_map++)
{
CharCode cc = charCodeArrayList.get(i_map);
if(st.startsWith(cc.getCode()))
{
System.out.println("found: " + cc.getChr());
st = st.substring(cc.getCode().length());
break;
}//end if
}//end for
}//end while
添加回答
举报