Python:查找句子的所有字谜

时间:2016-11-21 16:21:42

标签: python string algorithm big-o anagram

我想从一个短语中找到所有可能的字谜,例如,如果我输入“Donald Trump”,我应该得到“Darn mud plot”,“Damp old runt”以及可能还有数百个。

我有一本大约10万字的词典,没有问题。

但我能想到的唯一方法是遍历字典并将可以从输入构建的所有单词添加到列表中。然后循环遍历列表,如果字长小于输入的长度,则循环遍历字典,再次添加所有可能的字,这些字可以使其成为输入的长度或更少。并保持循环直到我拥有长度等于输入长度的有效单词的所有组合。

但这是O(n!)的复杂性,它几乎可以永远运行。我试过了。

有没有办法解决这个问题,复杂性会降低?我可能已经在网上找到了perl的东西,但我绝对不能阅读perl代码,尤其不是perl golf。

1 个答案:

答案 0 :(得分:3)

我喜欢你将单词列表过滤到可能用输入字母组成的单词的想法,我喜欢尝试将它们串在一起的想法,但我认为你可以进行一些主要的优化投入使用可能会加快速度。

对于初学者而言,我不是选择一个单词,然后重新扫描整个字典中剩下的内容,而是考虑在开始时只进行一次过滤,以找到所有可能出现的单词。你有的信件。你的词典可能会非常庞大​​(150,000+,我怀疑),所以在每个决策点之后重新扫描它将是完全不可行的。一旦你拥有了一组你可以在字谜中合法使用的单词,你就可以从中找到问题,找出它们的哪些组合可以用来构成句子的完整字谜。

我首先找到无序的字词列表,这些字词是针对目标的字谜而不是所有可能的有序字词列表,因为有许多字词列表他们找不到更少。获得无序列表后,您可以很快地从它们生成排列。

为此,我使用回溯递归,在每个点保持剩余字母数的直方图。您可以使用它来过滤掉不能再添加的单词,这实际上可以节省每次检查整个字典的成本。我想象这次递归将会结束很多,并且您可能会毫不费力地找到所有答案。

您可能会考虑其他一些启发式方法。例如,您可能希望首先从较大的单词开始,尽可能多地输出字母并保持较低的分支因子。为此,您可以将单词列表从最长到最短排序,然后按顺序尝试单词。您也可以尝试首先使用最受约束的字母来减少分支因子。这些启发式方法在实践中可能会很有效。

总体而言,在最糟糕的情况下,你仍然在看指数工作,但对于较短的字符串来说,它不应该太糟糕。