我敢打赌之前有人已经解决了这个问题,但我的搜索结果是空的。
我想将单词列表打包到缓冲区中,跟踪每个单词的起始位置和长度。诀窍是我想通过消除冗余来有效地打包缓冲区。
示例:娃娃屋
这些可以简单地打包到缓冲区中dollhouse
,记住doll
从位置 0 开始是四个字母,在 0dollhouse
是九个字母,house
在 3 是五个字母。
到目前为止,我想出的是:
- 将单词从最长到最短排序:(娃娃屋、房子、娃娃)
- 扫描缓冲区以查看字符串是否已作为子字符串存在,如果存在,请记下位置。
- 如果它尚不存在,请将其添加到缓冲区的末尾。
由于长词通常包含较短的词,因此效果很好,但应该可以做得更好。例如,如果我扩展单词列表以包含 ragdoll,那么我的算法会dollhouseragdoll
比ragdollhouse
.
这是一个预处理步骤,所以我并不十分担心速度。O(n^2) 很好。另一方面,我的实际列表有数万个单词,所以 O(n!) 可能是不可能的。
作为旁注,此存储方案用于 TrueType 字体的“名称”表中的数据,参见。http://www.microsoft.com/typography/otspec/name.htm