class TrieNode:
def __init__(self):
self.children = {}
self.isEnd = False
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word):
node = self.root
for c in word:
if c not in node.children:
node.children[c] = TrieNode()
node = node.children[c]
node.isEnd = True
def search(self, word):
node = self._findNode(word)
return node is not None and node.isEnd
def startsWith(self, prefix):
return self._findNode(prefix) is not None
def _findNode(self, s):
node = self.root
for c in s:
if c not in node.children:
return None
node = node.children[c]
return node
The helper _findNode avoids duplicating traversal logic between search and startsWith.