核心思想:26叉树
思路:
前缀树,又称字典树。
每个节点创建一个26长度的数组,数组索引index对应字母,0对应a,1对应b,2对应c…。
插入时,如果不存在,则为该节点创建一个26长度的数组(即children不为null),存在,则探索下一个节点。
查找时,则就按照待查找字符串,一位一位的进行查找,通过char-‘a’获取index,比较children是否为空。
查找前缀和查找同理。
简言之,对应索引位置Trie数组是否为空,就是字母是否存在的意思。
class Trie {
private Trie[] children;
private boolean isEnd;
public Trie() {
children = new Trie[26];
isEnd = false;
}
public void insert(String word) {
//this是根节点
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;
}
public boolean search(String word) {
Trie node = searchPrefix(word);
return node != null && node.isEnd;
}
public boolean startsWith(String prefix) {
return searchPrefix(prefix) != null;
}
public 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;
}
}
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* boolean param_2 = obj.search(word);
* boolean param_3 = obj.startsWith(prefix);
*/