由小米面试引发的字典树,面试过程中,才知道有字典树这个玩意。
字典树简单实现
#coding=utf-8
class Trie:
root = {}
END = '/'
def add(self, word):
#从根节点遍历单词,char by char,如果不存在则新增,最后加上一个单词结束标志
node = self.root
for c in word:
node=node.setdefault(c,{})
node[self.END] = None
def find(self, word):
node = self.root
for c in word:
if c not in node:
return False
node = node[c]
return self.END in node
字典树复杂实现
#!/usr/bin/env python3
class Trie:
root = dict()
def insert(self, string):
index, node = self.findLastNode(string)
for char in string[index:]:
new_node = dict()
node[char] = new_node
node = new_node
def find(self, string):
index, node = self.findLastNode(string)
return (index == len(string))
def findLastNode(self, string):
'''
@param string: string to be searched
@return: (index, node).
index: int. first char(string[index]) of string not found in Trie tree. Otherwise, the length of string
node: dict. node doesn't have string[index].
'''
node = self.root
index = 0
while index < len(string):
char = string[index]
if char in node:
node = node[char]
else:
break
index += 1
return (index, node)
def printTree(self, node, layer):
if len(node) == 0:
return '\n'
rtns = []
items = sorted(node.items(), key=lambda x:x[0])
rtns.append(items[0][0])
rtns.append(self.printTree(items[0][1], layer+1))
for item in items[1:]:
rtns.append('.' * layer)
rtns.append(item[0])
rtns.append(self.printTree(item[1], layer+1))
return ''.join(rtns)
def __str__(self):
return self.printTree(self.root, 0)
if __name__ == '__main__':
tree = Trie()
while True:
src = input()
if src == '':
break
else:
tree.insert(src)
print(tree)