A trie (pronounced as "try") or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and spellchecker.
Implement the Trie class:
-
Trie()
Initializes the trie object. -
void insert(String word)
Inserts the stringword
into the trie. -
boolean search(String word)
Returnstrue
if the stringword
is in the trie (i.e., was inserted before), andfalse
otherwise. -
boolean startsWith(String prefix)
Returnstrue
if there is a previously inserted stringword
that has the prefixprefix
, andfalse
otherwise.
Example 1:
Input
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
Output
[null, null, true, false, true, null, true]
Explanation
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // return True
trie.search("app"); // return False
trie.startsWith("app"); // return True
trie.insert("app");
trie.search("app"); // return True
Constraints:
-
1 <= word.length, prefix.length <= 2000
-
word
andprefix
consist only of lowercase English letters. - At most
3 * 104
calls in total will be made toinsert
,search
, andstartsWith
.
SOLUTION:
class Node:
def __init__(self, val=None, children=[], end=False):
self.val = val
self.children = children
self.end = end
class Trie:
def __init__(self):
self.root = Node(val=None, children=[])
def insert(self, word: str) -> None:
n = len(word)
curr = self.root
for i, c in enumerate(word):
found = False
for node in curr.children:
if node.val == c:
curr = node
found = True
break
if not found:
newcurr = Node(val=c, children=[])
curr.children.append(newcurr)
curr = newcurr
curr.end = True
def search(self, word: str) -> bool:
n = len(word)
curr = self.root
for i, c in enumerate(word):
found = False
for node in curr.children:
if node.val == c:
curr = node
found = True
break
if not found:
return False
return curr.end
def startsWith(self, prefix: str) -> bool:
n = len(prefix)
curr = self.root
for i, c in enumerate(prefix):
found = False
for node in curr.children:
if node.val == c:
curr = node
found = True
break
if not found:
return False
return True
# class Trie:
# def __init__(self):
# self.trie = {}
# def insert(self, word: str) -> None:
# word = list(word) + [-1]
# n = len(word)
# for i in range(n - 1):
# if i not in self.trie:
# self.trie[i] = {}
# if word[i] in self.trie[i]:
# self.trie[i][word[i]].add(word[i + 1])
# else:
# self.trie[i][word[i]] = {word[i + 1]}
# def search(self, word: str, isPartial = False) -> bool:
# if not isPartial:
# word = list(word) + [-1]
# n = len(word)
# if n == 1:
# if word[0] in self.trie.get(0, {}):
# return True
# else:
# return False
# for i in range(n - 1):
# if i not in self.trie or word[i] not in self.trie[i] or word[i + 1] not in self.trie[i][word[i]]:
# return False
# return True
# def startsWith(self, prefix: str) -> bool:
# return self.search(prefix, isPartial = True)
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)
Top comments (0)