我整天都在想这个问题,似乎无法找出一种记忆有效且快速的方法。
问题是:
例如,我有这些信:
e f j l n rr t t u w x(12 个字母)
我正在找这个词
海龟(6 个字母)
如何使用 php 找到完整范围(12 个单词)中所有可能的单词?
(或者使用 python,是否会容易很多?)
我尝试过的事情:
使用排列:我已经使用排列算法使所有字符串成为可能,将它们放入数组中(仅 6 个字符长的字符串)并执行 in_array 来检查它是否与数组中的某个单词与有效单词匹配(在本例中,包含 TURTLE,但有时包含两个或三个单词)。
这种计算会消耗大量内存和时间,尤其是需要 6 个以上的字符进行排列时。
创建一个正则表达式(我不擅长这个)。我想创建一个正则表达式来检查 12 个(输入)字符中的 6 个是否在“有效数组”中的单词中。问题是,我们不知道 12 中的哪个字母将是起始位置以及其他单词的位置。
一个例子是:http://drawsomethingwords.net/ http://drawsomethingwords.net/
我希望你能帮助我解决这个问题,因为我真的很想解决这个问题。
感谢您抽出宝贵的时间:)
我在编写填字游戏编辑器时遇到了类似的问题(例如,查找第二个位置上带有“B”的所有长度为 5 的单词)。基本上可以归结为:
- 处理单词列表并按长度组织单词(即长度为 2、长度 3、长度 4 等的所有单词的列表)。原因是您通常知道要搜索的单词的长度。如果您想搜索长度未知的单词,您可以再次重复搜索不同的单词列表。
- 将每个单独的单词列表插入到三级搜索树 https://en.wikipedia.org/wiki/Ternary_search_tree这使得搜索单词的速度更快。树中的每个节点都包含一个字符,您可以沿树向下搜索单词。还有一些专门的数据结构,例如trie https://en.wikipedia.org/wiki/Trie但我还没有探索过。
现在对于您的问题,您可以使用搜索树编写一个搜索函数,例如
function findWords($tree, $letters) {
// ...
}
where tree
是包含您要搜索的长度的单词的搜索树,并且letters
是有效字符的列表。在你的例子中,letters
将是字符串efjlnrrttuwx
.
搜索树允许您一次搜索一个字符,并且可以跟踪迄今为止遇到的字符。只要这些字符在有效字母列表中,您就可以继续搜索。在搜索树中遇到叶节点后,您就找到了一个现有单词,可以将其添加到结果中。如果您遇到不在其中的角色letters
(或者它已经被使用过),您可以跳过该单词并在搜索树中的其他位置继续搜索。
我的填字游戏编辑器Palabra https://bitbucket.org/svisser/palabra包含上述步骤的实现(一部分是用 Python 完成的,但大部分是用 C 完成的)。对于包含大约 70K 单词的 Ubuntu 默认单词列表来说,它的运行速度足够快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)