题目208. 实现 Trie (前缀树) - 力扣(LeetCode)
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", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] 输出 [null, null, true, false, true, null, true] 解释 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
代码思路
Trie 本质是一种 树形结构
每个节点保存:
-
children[26] —— 指向 26 个字母的下一个节点
-
isend —— 标记当前节点是否是某个单词的结尾
Trie 树实现:
用数组 children 链接子节点
isend 标记单词结束
insert —— 逐字符建路径
search —— 找到路径 + 必须是单词结尾
startsWith —— 找到路径即可
class Trie {
private Trie[] children;// 每个节点可能有 26 个子节点
private boolean isend ;// 用来标记该位置是否是单词结束
public Trie() {//创建一个空节点 没有孩子 不是结尾
children = new Trie[26];//26个字母
isend = false;
}
public void insert(String word) {
Trie node = this;
for(int i =0;i<word.length();i++){
int index = word.charAt(i)-'a';//
if(node.children[index]==null){
node.children[index]=new Trie();
}
node = node.children[index];
}
node.isend =true;
}
public boolean search(String word) {
if(searchpre(word)!=null&&searchpre(word).isend){
return true;
}
return false;
}
public boolean startsWith(String prefix) {
if(searchpre(prefix)!=null){
return true;
}
return false;
}
private Trie searchpre(String st){
Trie node = this;
for(int i=0;i<st.length();i++){
int index = st.charAt(i)-'a';
if(node.children[index]==null){
return null;
}
node = node.children[index];
}
return node;
}
}

434

被折叠的 条评论
为什么被折叠?



