Ну, он еще не существует, но он уже исследован на SO, для проблем кроссвордов.
Суть решения, которое я предложил, заключалась в индексации по буквам и индексам, что в Python дает:
class Index:
def __init__(self, list):
self.data = defaultdict(set)
for word in list: self.add(word)
def add(self, word):
for l in range(0, len(word)):
self.data[(l, word[l])].insert(word)
def look(self, letters):
"""letters is a list of tuples (position, letter)"""
result = None
for (p,l) in letters:
set = self.data[(p,l)]
if result == None: result = set
else: result = result.insersection(set)
return result
Идея проста: у вас есть большой индекс, в котором есть набор слов для каждой пары (position,letter)
. В вашем случае это может быть расширено, чтобы иметь один индекс на длину слова, что уменьшило бы размер наборов слов и, следовательно, было бы быстрее.
Для поиска вы просто пересекаете все наборы, чтобы получить общий набор слов, который соответствует всем известным буквам.