假设有一种加密字符串的方法:
例如,单词FRUIT按以下方式加密:
We append the character $ at the end of the word:
FRUIT$
We then form all the strings by moving the first character at the end:
FRUIT$
RUIT$S
UIT$FR
IT$FRU
T$FRUI
$FRUIT
Then we sort the new strings into alphabetical order:
$FRUIT
FRUIT$
IT$FRU
RUIT$F
T$FRUI
UIT$FR
The encrypted string:
T$UFIR
现在我的问题很明显:如何将给定的字符串解密为原始形式。
我现在已经冲了半个星期了,我终于没纸了。
我应该如何继续这个?
我发现了什么:
如果我们有加密的最后一步:
$FRUIT
FRUIT$
IT$FRU
RUIT$F
T$FRUI
UIT$FR
我们可以知道原始字符串的第一个和最后一个字符,因为最右边的列是加密字符串本身,最左边的列总是按字母顺序排列。最后一个字符是加密字符串的第一个字符,因为$始终是字母表中的第一个字符,并且它只在字符串中存在一次。然后,如果我们从最右边的列中找到$字符,并在最左边的列中查找同一行上的字符,我们将得到第一个字符。
所以我们对加密字符串T $ UFIR的了解是原始字符串是F *** T $,其中*是未知字符。
结束了我的想法。现在我必须利用全球网络并询问另一个人:怎么样?
你可以说这是家庭作业,熟悉我的导师,我认为这是一个动态的编程问题。
答案 0 :(得分:15)
这是Burrows-Wheeler变换。
这是一种通常用于辅助压缩算法的算法,因为它倾向于将常见的重复短语组合在一起,并且是可逆的。
解码你的字符串:
每个角色的编号:
T$UFIR
012345
现在排序,保留编号。如果字符重复,则使用索引作为辅助排序键,以便重复字符的索引按升序保持,或者使用保证此值的排序算法。
$FIRTU
134502
现在我们可以解码了。从'$'开始,并使用相关的索引作为输出的下一个字符('$'= 1,所以下一个字符是'F'。'F'是3,所以下一个字符是'R',等等...)
结果:
$FRUIT
所以只需删除标记字符,即可完成。