一、题目
实现一个前缀树类,提供三个操作,
1)insert(word):插入一个单词。
2)search(word):判断单词是否完整存在于 Trie 中。
3)startsWith(prefix):判断是否存在以该前缀开头的单词。


二、思路
1、每个节点,使用定长数组实现子节点映射;isEnd=true属性表示从根节点到当前节点拼出的字符串是一个完整的词。
2、一种26叉树结构,每个节点代表一个字符,从根到某节点的路径构成一个前缀;通过 isEnd 标记该路径是否为一个完整单词的结尾。
三、代码
class Trie {
class TrieNode{
TrieNode[] children;
boolean isEnd;
public TrieNode(){
children = new TrieNode[26];
isEnd = false;
}
}
private TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode node = root;
for(char c : word.toCharArray()){
int index = c - 'a';
if(node.children[index] == null){
node.children[index] = new TrieNode();
}
node = node.children[index];
}
node.isEnd = true;
}
public boolean search(String word) {
TrieNode node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}
public TrieNode searchPrefix(String prefix){
TrieNode node = root;
for(char c : prefix.toCharArray()){
int index = c - 'a';
if(node.children[index] == null){
return null;
}
node = node.children[index];
}
return node;
}
}