Структура данных, которую вы ищите, называется trie. Статья Википедии об этом виде дерева поиска, безусловно, стоит прочитать. Ключевым свойством, что синтаксического дерева пригождается здесь заключается в следующем:
Все потомки узла имеют общий префикс строки, связанной с этим узлом, и корень связан с пустой строкой.
Код может выглядеть следующим образом:
words = """py
python
co
comp
computer""".split()
def make_trie(ws):
"""Build trie from word list `ws`."""
r = {} # trie root
for w in ws:
d = r
for c in w:
d = d.setdefault(c, {}) # get c, set to {} if missing
d['$'] = '$' # end marker
return r
def num_pref(t, ws):
"""Use trie `t` to find word with max num of prefixes in `ws`."""
b, m = -1, '' # max prefixes, corresp. word
for w in ws:
d, p = t, 1
for c in w:
if '$' in d: p += 1
d = d[c] # navigate down one level
if p > b: b, m = p, w
return b, m
t = make_trie(words)
print(num_pref(t, words))
make_trie
строит синтаксическое дерево, num_pref
использует его, чтобы определить слово с максимальным числом префиксов. Он печатает (3, 'computer')
.
Очевидно, что оба метода могут быть объединены. Я сохранил их в отдельности, чтобы сделать процесс построения три более ясным.
Ну, одним из улучшений было бы вырезать 'word = str (i)' part out и просто переменную 'i'. Если 'i' уже является строкой, нет причин для ее преобразования. Если я не пропущу что-то очень очевидное ... –
Возможно, вы сможете использовать дерево radix, но я думаю, что все равно будет O (n^2) –
@PatrickHaugh Почему это будет O (n ** 2)? Вы можете просто перебрать все листья и подсчитать терминальные узлы между листом и корневым узлом. –