208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert
, search
, 和 startsWith
这三个操作。
示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true
说明:
- 你可以假设所有的输入都是由小写字母
a-z
构成的。 - 保证所有输入均为非空字符串。
解题思路:首先说明前缀树的三个性质:
1,根节点不包含字符,除根节点外每一个节点都只包含一个字符;
2,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
3,每个节点的所有子节点包含的字符都不相同
具体实现时,前缀树使用字典保存某节点的若干孩子节点,使用isword来标记到某节点的路径是否为关键字,三种操作insert
, search
, 和 startsWith
的做法简单且相似。
trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。
Python3代码如下:
class Node():
def __init__(self):
self.children = {}
self.isword = False
class Trie(object):
def __init__(self):
"""
Initialize your data structure here.
"""
self.root = Node()
def insert(self, word):
"""
Inserts a word into the trie.
:type word: str
:rtype: None
"""
node = self.root
for w in word:
if w not in node.children:
node.children[w] = Node()
node = node.children[w]
node.isword = True
def search(self, word):
"""
Returns if the word is in the trie.
:type word: str
:rtype: bool
"""
node = self.root
for w in word:
if w not in node.children:
return False
node = node.children[w]
return node.isword
def startsWith(self, prefix):
"""
Returns if there is any word in the trie that starts with the given prefix.
:type prefix: str
:rtype: bool
"""
node = self.root
for w in prefix:
if w not in node.children:
return False
node = node.children[w]
return 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)