208. 实现 Trie (前缀树)
思路:
- 每一个节点都有一个属性isEnd,如果isEnd =True,则说明从根结点开始到现在位置是一个之前添加过的词。
- 每一个节点还有26个next指针,指向下一个字母(这里字母用0-25的序号表示),如果下一个字母不存在,则是null
- 每次我们添加一个元素,即说明每一个字母存在,只需要将对应的next指针上开一个节点的空间即可。
- 整个单词的存在由最后一个节点的isEnd = True表示。
class Trie {
class TrieNode{
private boolean isEnd;
TrieNode[] next;
public TrieNode(){
isEnd = false;
next = new TrieNode[26];
}
}
private TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode tmp = root;
for(char c : word.toCharArray()){
if(tmp.next[c-'a'] == null){
tmp.next[c-'a'] = new TrieNode();
}
tmp = tmp.next[c-'a'];
}
tmp.isEnd = true;
}
public boolean search(String word) {
TrieNode tmp = root;
for(char c : word.toCharArray()){
if(tmp.next[c-'a']==null)
return false;
tmp = tmp.next[c-'a'];
}
return tmp.isEnd;
}
public boolean startsWith(String prefix) {
TrieNode tmp = root;
for(char c : prefix.toCharArray()){
if(tmp.next[c-'a']==null)
return false;
tmp = tmp.next[c-'a'];
}
return true;
}
}