题干:
Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
class Trie{
private Trie[] children;
//表示该节点是否为字符串的结尾
private boolean isEnd;
public Trie(){
children = new Trie[26];
isEnd = false;
}
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;
}
private Trie searchPrefix(String prefix){
Trie node = this;
for(int i=0;i<prefix.length();i++){
char ch = prefix.charAt(i);
int index = ch-'a';
if(node.children[index]==null) return null;
node = node.children[index];
}
return node;
}
public boolean search(String word) {
Trie node = searchPrefix(word);
if(node!=null&&node.isEnd){
return true;
}
return false;
}
public boolean startsWith(String prefix) {
Trie node = searchPrefix(prefix);
return node!=null;
}
}
前缀树是一个多叉树,根据此题我们可以构建一个特定的前缀树(包含26个英文字母的Trie数组,每一个下标对应一个字母,以及一个表明当前节点是否为结尾的isEnd标志)
insert操作:遍历当前字符串,根据每一个字符所在的位置创建对应的子前缀树,再把最后一个节点的isEnd标志置为true,表明从根节点到当前节点的路径就是我们插入的字符串。
search操作:通过一个searchPrefix函数,查找当前字符串对应的前缀树链是否存在,若存在,则searchPrefix返回树链的末尾节点,不存在则返回为空。当searchPrefix返回为空时,表明没找到;若返回了末尾节点,且末尾节点的isEnd为true,则表明查找到了。
startsWith操作:其实就是searchPrefix操作,只需要判断searchPrefix是否返回空即可。