题目
实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true;否则false 。boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一,返回 true ;否则false。
每个节点包含以下字段:指向子节点的指针数组 children和布尔字段 isEnd;
插入字符串:子节点存在。沿着指针移动到子节点,继续处理;不存在则创建新的子节点记录;
查找前缀:子节点存在。沿着指针移动到子节点,继续搜索下一个字符;不存在返回空指针。
class Trie {
private Trie[] children;
private boolean isend;
/** Initialize your data structure here. */
public Trie() {
children =new Trie[26];
isend=false;
}
/** Inserts a word into the trie. */
public void insert(String word) {
Trie node =this;
for(int i=0;i<word.length();i++){
char ch=word.charAt(i);
int index =ch-'a';
if(node.children[index]==null){
node.children[index]=new Trie();
}
node=node.children[index];
}
node.isend=true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
Trie node=searchpre(word);
return node!=null&&node.isend;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
return searchpre(prefix)!=null;
}
private Trie searchpre(String pre){
Trie node=this;
for(int i=0;i<pre.length();i++){
char ch=pre.charAt(i);
int index =ch-'a';
if(node.children[index]==null){
return null;
}
node=node.children[index];
}
return node;
}
}
复杂度分析
时间复杂度:初始化为 O(1),其余操作为 O(∣S∣),其中 |S|是每次插入或查询的字符串的长度。
空间复杂度: O(∣T∣⋅Σ)