60 lines
1.5 KiB
Python
60 lines
1.5 KiB
Python
class Node:
|
|
def __init__(self, leaf=False):
|
|
# refs list of next valid characters
|
|
self.letters = [None] * 26
|
|
self.isLeaf = leaf
|
|
|
|
|
|
class Trie:
|
|
def __init__(self):
|
|
self.root = Node()
|
|
|
|
def _charIndex(self, char):
|
|
return ord(char) - ord('a')
|
|
|
|
def insert(self, string):
|
|
curr = self.root
|
|
for i in string:
|
|
refIndex = self._charIndex()
|
|
# create nodes if we have to
|
|
if curr.letters[refIndex] is None:
|
|
curr.letters[refIndex] = Node()
|
|
|
|
curr = curr.letters[refIndex]
|
|
# Set the last letter to be a leaf
|
|
curr.isLeaf = True
|
|
|
|
def remove(self, string):
|
|
# Lazy removal
|
|
curr = self.root
|
|
for i in string:
|
|
refIndex = self._charIndex(i)
|
|
if curr.letters[refIndex] is None:
|
|
break
|
|
curr = curr.letters[refIndex]
|
|
curr.isLeaf = False
|
|
|
|
|
|
# We're also going to be printing things as we go along the thing
|
|
def lookup(self, string):
|
|
curr = self.root
|
|
for i in string:
|
|
refIndex = self._charIndex(i)
|
|
# Make sure we don't walk into nothing
|
|
if curr.letters[refIndex] is None:
|
|
return False
|
|
curr = curr.letters[refIndex]
|
|
print(i, end='')
|
|
|
|
return curr.isLeaf
|
|
|
|
def all(self, node, word):
|
|
if node is None:
|
|
return
|
|
|
|
if node.isLeaf:
|
|
# Print out the word we have so far
|
|
self.lookup(word)
|
|
|
|
|