我有一个大约10万字的字典,我希望能够找到 那些符合某些模式的词的排列。模式可以是 描述为整数列表,并且单词列表与之匹配 如果有一种方法可以将整数映射到字母,那么如果你有 用字母替换模式中的每个整数,你得到那个单词列表, 级联。
举个例子,我们假设我们的字典包含:
A
ANA
APPLE
BANANA
...
我们正在寻找的模式是([1]):
1 2 1 3 1 4 1 5 1
然后一个解决方案是[ANA,BANANA],其映射:
1:A 2:N 3:B 4:N 5:N
现在,我可以想到几种方法来实现它。对于 例如,我们可以选择具有正确长度的每个单词排列,以及 过滤那些没有映射冲突的过滤器。或者解决问题 递归地,到目前为止,每个模式和映射,尝试所有单词 长度小于或等于模式,不与之冲突 映射到目前为止,递归调用此算法的模式 保留,更新的映射。
但是这些解决方案对字典和模式I的大小来说非常慢
和我一起工作。如果模式P
的长度为|P|
,则字典D
长度为|D|
,平均字长为n
,我们正在考虑
算法大约为O(|D|^{|P|/n})
。 (我希望管理模式
大小为50-100,想象n
约为5。)
有更好的算法吗?
[1]请注意,这有点像正则表达式中的反向引用 - 例如
模式1 2 1
对应于正则表达式(.)(.)\1
- 但我们
不能只使用正则表达式,因为“搜索”的文本不是固定的,而是字典中任何的单词排列。