我整天都在考虑这个问题,似乎无法找出一种高效而快速的内存存储方式.
问题是:
例如,我有这些字母:
e f j l n r r t t u w x(12个字母)
我正在寻找这个词
龟(6个字母)
如何使用php查找完整范围(12个单词)中的所有可能单词?
(或者使用python,如果那样可能会容易得多?)
我尝试过的事情:
>使用置换:我已经使用置换算法使所有字符串成为可能,将它们放入数组(仅长6个字符),并执行in_array来检查它是否与我的数组中的单词之一匹配有效单词(在这种情况下) ,其中包含TURTLE,但有时包含两个或三个单词).
这种计算会花费大量的内存和时间,尤其是要获得6个字符的排列.
>创建一个正则表达式(对此我很不好).我想创建一个正则表达式来检查12个(输入)字符中的6个是否在“有效数组”中的一个单词中.问题是,我们不知道12中的哪个字母将成为起始位置以及其他单词的位置.
例如:
http://drawsomethingwords.net/
希望您能为我解决这个问题,因为我真的很想解决此问题.
感谢您的所有时间:)
解决方法:
在编写填字游戏编辑器时遇到了类似的问题(例如,找到所有长度为5的单词,第二个位置带有“ B”).基本上可以归结为:
>处理单词列表并按长度组织单词(即长度为2,长度为3,长度为4的所有单词的列表).原因是您经常知道要搜索的单词的长度.如果要搜索长度未知的单词,可以再次搜索其他单词列表.
>将每个单独的单词列表插入tertiary search tree,这使搜索单词快得多.树中的每个节点都包含一个字符,您可以下降树以搜索单词.还有一些专门的数据结构,例如trie,但我尚未探索.
现在针对您的问题,您可以使用搜索树编写搜索功能,例如
function findWords($tree, $letters) {
// ...
}
其中tree是搜索树,其中包含您要搜索的长度的单词,而字母是有效字符的列表.在您的示例中,字母将为字符串efjlnrrttuwx.
搜索树使您可以一次搜索一个字符的单词,并且可以跟踪到目前为止遇到的字符.只要这些字符在有效字母列表中,您就可以继续搜索.在搜索树中遇到叶子节点后,您将找到一个现有单词,可以将其添加到结果中.如果遇到的字符不是字母(或已经被使用),则可以跳过该单词并在搜索树中的其他位置继续搜索.
我的填字游戏编辑器Palabra包含上述步骤的实现(一部分在Python中完成,但大部分在C中完成).它对于包含大约70K个单词的Ubuntu默认单词列表足够快地工作.