核心思想: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) {
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;
}
}
|