这些答案中的大多数都非常低效和/或只会给出一个单词的解决方案(没有空格)。我的解决方案可以处理任意数量的单词并且非常有效。
你想要的是一个 trie 数据结构。这是一个完整的Python 实现。您只需要保存在一个名为的文件中的单词列表,words.txt
您可以在此处尝试拼字游戏词典单词列表:
http://www.isc.ro/lists/twl06.zip
MIN_WORD_SIZE = 4 # min size of a word in the output
class Node(object):
def __init__(self, letter='', final=False, depth=0):
self.letter = letter
self.final = final
self.depth = depth
self.children = {}
def add(self, letters):
node = self
for index, letter in enumerate(letters):
if letter not in node.children:
node.children[letter] = Node(letter, index==len(letters)-1, index+1)
node = node.children[letter]
def anagram(self, letters):
tiles = {}
for letter in letters:
tiles[letter] = tiles.get(letter, 0) + 1
min_length = len(letters)
return self._anagram(tiles, [], self, min_length)
def _anagram(self, tiles, path, root, min_length):
if self.final and self.depth >= MIN_WORD_SIZE:
word = ''.join(path)
length = len(word.replace(' ', ''))
if length >= min_length:
yield word
path.append(' ')
for word in root._anagram(tiles, path, root, min_length):
yield word
path.pop()
for letter, node in self.children.iteritems():
count = tiles.get(letter, 0)
if count == 0:
continue
tiles[letter] = count - 1
path.append(letter)
for word in node._anagram(tiles, path, root, min_length):
yield word
path.pop()
tiles[letter] = count
def load_dictionary(path):
result = Node()
for line in open(path, 'r'):
word = line.strip().lower()
result.add(word)
return result
def main():
print 'Loading word list.'
words = load_dictionary('words.txt')
while True:
letters = raw_input('Enter letters: ')
letters = letters.lower()
letters = letters.replace(' ', '')
if not letters:
break
count = 0
for word in words.anagram(letters):
print word
count += 1
print '%d results.' % count
if __name__ == '__main__':
main()
当你运行程序时,单词会被加载到内存中的 trie 中。之后,只需输入您要搜索的字母,它就会打印结果。它只会显示使用所有输入字母的结果,不会更短。
它从输出中过滤掉短词,否则结果的数量是巨大的。随意调整MIN_WORD_SIZE
设置。请记住,仅使用“astronomers”作为输入,如果MIN_WORD_SIZE
为 1,则会得到 233,549 个结果。也许您可以找到一个更短的单词列表,其中只包含更常见的英语单词。
MIN_WORD_SIZE
此外,除非您将“im”添加到字典并设置为 2 ,否则缩略词“I'm”(来自您的一个示例)不会出现在结果中。
获取多个单词的技巧是每当您在搜索中遇到一个完整的单词时就跳回树中的根节点。然后你继续遍历 trie,直到所有字母都用完。