问题描述
我有这个 Trie:
a
/ \
b c
/ \ \
t y u
2 5 3
numbers at leaf stands for frequency,stored at the terminal node
并且我有默认的 Trie 搜索功能来搜索字符串。当我执行 search('a')
时,它会返回 aby
,因为它是最常插入的字符串。频率由 self.count
存储在我的函数中。
我不想发布我的代码。
您将如何解决并将节点从 a
返回到 y
?
提前致谢。
解决方法
您可以使用递归生成器函数遍历特里树并生成包含搜索值作为子字符串的所有字符串:
简单的尝试设置:
class Trie:
def __init__(self,l=None):
self.l,self.count,self.tree = l,[]
def insert_l(self,word):
if word:
if not (n:=[i for i in self.tree if i.l == word[0]]):
self.tree.append(Trie(word[0]))
self.tree[-1].add_word(word)
else:
n[-1].add_word(word)
def add_word(self,word):
if self.l is not None:
self.count += 1
self.insert_l(word if self.l is None else word[1:])
现在,可以将 search
方法添加到 Trie
:
class Trie:
...
def search(self,word):
def _search(t,c = []):
if not t.tree:
yield c+[t]
else:
for i in t.tree:
yield from _search(i,c if t.l is None else c+[t])
if (l:=[(j,i) for i in _search(self) if word in (j:=''.join(k.l for k in i))]):
return max(l,key=lambda x:x[-1][-1].count)[0]
t = Trie()
words = ['abt','abt','aby','acu','acu']
for word in words:
t.add_word(word)
print(t.search('a'))
输出:
'aby'