Day14-Implement Trie (Prefix Tree)(Medium)
问题描述:
Implement a trie with insert, search, and startsWith methods.
Example:
Example:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // returns true
trie.search("app"); // returns false
trie.startsWith("app"); // returns true
trie.insert("app");
trie.search("app"); // returns true
这次先写例子的原因就是问题描述太简易了,我第一遍看的时候是没明白要干啥,看了例子才懂,说让我们实现一种数据结构的三种功能,插入,搜索,以及给定一个字符串检测“树”中的元素的前缀是否等于这个字符串。
解法一:
第一眼看过去挺简单的,就是无脑建立一个数组,插入就是往数组中插入值呗,搜索就是搜索数组中的元素,时间复杂度为O(N),而检测是否是前缀的那个函数就是在遍历数组中的元素时,我们取出元素先判断这个值的长度是否大于等于给定字符串长度,如果是再判断前缀是否相等。时间复杂度为O(N*M)
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.tree = []
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
self.tree.append(word)
def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
for t in self.tree:
if t == word:
return True
return False
def startsWith(self, prefix: str) -> bool:
"""
Returns if there is any word in the trie that starts with the given prefix.
"""
for t in self.tree:
if len(t) >= len(prefix) and t[:len(prefix)] == prefix:
return True
return False
# 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)
解法二:
上面那种暴力解法缺陷肯定就是时间复杂度高了。看了网上大神的博客后才知道这是一种特殊的树结构,字典树(孤陋寡闻了。。。之前好像从没听过)。这里贴一下一位大神关于这道题解法的地址吧,因为第一次用这种结构,也处于迷糊状态,解释不清,可以去看看大神的解析,很清楚,代码也很漂亮写的。
【LeetCode】208. Implement Trie (Prefix Tree) 解题报告(Python & C++)