208.实现Trie前缀树-python
208.最长递增子序列(中等)
题目大意:Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
- void insert(String word) 向前缀树中插入字符串 word 。
- boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
- boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false
题目
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
- void insert(String word) 向前缀树中插入字符串 word 。
- boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
- boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false
示例:
1 |
|
提示:
- 1 <= word.length, prefix.length <= 2000
- word 和 prefix 仅由小写英文字母组成
- insert、search 和 startsWith 调用次数 总计 不超过 3 * 104 次
分析和解答
Trie树还是很经典的,同样是一个妙脆妙妙角一样妙的结构。这个题主要需要记住的是首先构建一个TrieNode,代表Trie树中的每个节点:
1 |
|
在之后想想每次插入过程,每次都从root开始进行插入,第一次插入一个单词如“apple”的时候,首先是“a“,令node=root
,因为现在node肯定是空的,所以使得node.mapping['a']
为一个新的TrieNode,之后走到这个TrieNode上,node=node.mapping.get(c)
。特别注意,这里的mapping key是每个char,value是TrieNode类型的,在插入的最后,要使得node.is_end=True,标志出这个单词的结尾
在这样的插入条件下,第一次插入就是构建了一个超长的串。第二次插入的时候由于第一次插入过程中,有些节点已经可以共用了,所以就有“前缀”的感觉了,这样的感觉就是顺着串走,直到遇到新的后,就建立走到新的分支上,要想到Trie树并不是只插入一个字符串就结束了
找prefix和word都很简单,找word要多加一个判断is_end
题目解答:
1 |
|
208.实现Trie前缀树-python
http://example.com/2021/12/13/algorithms/leetcode-python/208-实现Trie前缀树-python/