Вы никогда не проходите свой путь должным образом. У вас есть два вложенных цикла for
, поэтому вы проходите только два дополнительных узла (символа) из вашего префикса.
Я предполагаю, что вы хотите вернуть один результат, даже если есть несколько строк с совпадающим суффиксом и соответствующим количеством.
Используйте цикл while
и продолжайте следовать наибольшему значению count
, пока не доберетесь до узла без дочерних элементов со значением, равным количеству текущего узла. Убедитесь, что вы end
имеют значение True для этого узла, поскольку это указывает на ошибку в вашем коде добавления слов:
def prefix_search(self, prefix):
# traverse the prefix
current = self.root
for c in prefix:
current = current.children[self.ord_char(c)]
if current is None:
return None # None is a much better return value than -1
while current is not None:
for child in current.children:
if child is None:
continue
if child.count == current.count:
# found first child with same score, continue from here
prefix += chr(child.index + 97)
current = child
break
else:
# no children with equal score, this is the longest match
assert current.end, "Data structure inconsistent"
return prefix
Демо-версия:
>>> trie.prefix_search('ch')
'chlara'
>>> trie.prefix_search('j')
'james'
и некоторые из этих крайних случаев:
>>> trie.add_word(('chlarissa', 9)) # longer word, lower count!
>>> trie.prefix_search('ch')
'chlara'
>>> trie.add_word(('janet', 6)) # same length and score as james, won't be found
>>> trie.prefix_search('j')
'james'
и если произошла ошибка в структуре данных; это намеренно устанавливает неправильный счет:
>>> trie.root.children[9].children[0].count = 7 # 'ja', 7, so higher, but not an end node
>>> trie.prefix_search('j')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 59, in prefix_search
AssertionError: Data structure inconsistent