Одна странность, которую я заметил, это передача пустого префикса в startsWith()
.Если этот метод смоделирован на методе Python str
startswith()
, то мы ожидаем True
:
>>> "apple".startswith("")
True
>>>
Но ваш Trie возвращает False
в этой ситуации:
>>> t = Trie()
>>> t.insert("apple")
>>> t.startsWith("")
False
>>>
Ниже я переделал ваш код, который я сделал в первую очередь, чтобы понять его, но я также обнаружил, что у вас были избыточности, в частности ваши функции Helper .Этот код исправляет причуду, упомянутую выше, и специфична для Python 3:
class Trie:
def __init__(self):
self.children = {}
self.isWord = False
def insert(self, word):
"""
Inserts a word into the trie.
:type word: str (or list internally upon recursion)
:rtype: None
"""
if not word:
return
head, *tail = word
if head not in self.children:
self.children[head] = Trie()
trie = self.children[head]
if tail:
trie.insert(tail)
else:
self.isWord = True
def search(self, word):
"""
Returns True if the word is in the trie.
:type word: str (or list internally upon recursion)
:rtype: bool
"""
if not word:
return False
head, *tail = word
if head in self.children:
if not tail and self.isWord:
return True
return self.children[head].search(word[1:])
return False
def startsWith(self, prefix):
"""
Returns if there is any word in the trie that starts with the given prefix.
:type prefix: str (or list internally upon recursion)
:rtype: bool
"""
if not prefix:
return True
head, *tail = prefix
if head in self.children:
return self.children[head].startsWith(tail)
return False