LeetCode 208 — Implement Trie (Prefix Tree)
Primer problema del patrón Tries. Un Trie (árbol de prefijos) es una estructura especializada para strings. Cada nodo tiene un dict de hijos por carácter y un flag
is_end. Aprende este patrón aquí; los 2 problemas siguientes son extensiones directas.
Concepto del Trie
Almacena palabras compartiendo prefijos. Para “apple” y “app”:
root
|
a
|
p
|
p ← is_end = True (fin de "app")
|
l
|
e ← is_end = True (fin de "apple")
Enunciado
Implementa un Trie con tres operaciones:
insert(word)— añade palabra.search(word)— devuelveTruesi la palabra exacta está en el Trie.startsWith(prefix)— devuelveTruesi algún palabra del Trie empieza porprefix.
Solución — Trie con dict de hijos
class TrieNode:
def __init__(self):
self.children = {} # char -> TrieNode
self.is_end = False # marca fin de palabra
class Trie:
def __init__(self):
self.root = TrieNode()
def insert(self, word: str) -> None:
node = self.root
for c in word:
if c not in node.children:
node.children[c] = TrieNode()
node = node.children[c]
node.is_end = True
def search(self, word: str) -> bool:
node = self._find(word)
return node is not None and node.is_end
def startsWith(self, prefix: str) -> bool:
return self._find(prefix) is not None
def _find(self, s):
node = self.root
for c in s:
if c not in node.children:
return None
node = node.children[c]
return nodeAnálisis:
- Tiempo: O(L) por operación (L = longitud de la palabra).
- Espacio: O(N · L) donde N = número de palabras.
- Veredicto: [OK] canónica.
is_end — la diferencia entre search y startsWith
Sin is_end, no podrías distinguir “app” de “appendage” si solo añadiste “appendage” — el camino “a→p→p” existiría pero no marcaría fin.
Auto-test
- Implementa Trie + TrieNode desde cero.
- Justifica el
is_end. - Trace mental: insert(“app”), insert(“apple”), search(“app”), search(“appl”), startsWith(“app”).
Conexiones
- Próximo: 211-design-add-and-search-words-data-structure — extiende con wildcards.
Estado
- Leído
- Implementado desde cero
- Resuelto en LeetCode