208. Implement Trie (Prefix Tree)
by Botao Xiao
Question
Implement a trie with insert, search, and startsWith methods.
Example:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // returns true
trie.search("app"); // returns false
trie.startsWith("app"); // returns true
trie.insert("app");
trie.search("app"); // returns true
Note:
You may assume that all inputs are consist of lowercase letters a-z.
All inputs are guaranteed to be non-empty strings.
Thinking:
- Method:
- 使用内部类TrieNode.
class Trie {
TrieNode root;
/** Initialize your data structure here. */
public Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TrieNode temp = root;
for(int i = 0; i < word.length(); i++){
int c = word.charAt(i) - 'a';
if(temp.childs[c] == null)
temp.childs[c] = new TrieNode();
temp = temp.childs[c];
}
temp.isLeaf = true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode temp = root;
for(int i = 0; i < word.length(); i++){
int c = word.charAt(i) - 'a';
if(temp.childs[c] != null) temp = temp.childs[c];
else return false;
}
return temp.isLeaf;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TrieNode temp = root;
for(int i = 0; i < prefix.length(); i++){
int c = prefix.charAt(i) - 'a';
if(temp.childs[c] == null) return false;
else temp = temp.childs[c];
}
return true;
}
private static class TrieNode{
boolean isLeaf;
TrieNode[] childs;
TrieNode(){
childs = new TrieNode[26];
}
}
}
/**
* 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);
*/
二刷
- 最典型的字典树,将每个字符作为一个结点,我们通过遍历的方式,将一个字符串的所有字符添加进入当前的树中。
- 如果已经到了最后一个字符,我们将当前节点的isLeaf设置成true。
class Trie {
private static class TrieNode{
boolean isLeaf;
TrieNode[] childs;
public TrieNode(){
childs = new TrieNode[26];
}
}
private TrieNode root;
/** Initialize your data structure here. */
public Trie() {
this.root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
int len = word.length();
TrieNode temp = root;
for(int i = 0; i < len; i++){
int c = word.charAt(i) - 'a';
if(temp.childs[c] == null){
temp.childs[c] = new TrieNode();
}
temp = temp.childs[c];
}
temp.isLeaf = true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
if(word == null || word.length() == 0) return true;
int len = word.length();
TrieNode temp = this.root;
for(int i = 0; i < len; i++){
int c = word.charAt(i) - 'a';
if(temp.childs[c] == null) return false;
else temp = temp.childs[c];
}
return temp.isLeaf;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
if(prefix == null || prefix.length() == 0) return false;
int len = prefix.length();
TrieNode temp = root;
for(int i = 0; i < len; i++){
int c = prefix.charAt(i) - 'a';
if(temp.childs[c] == null) return false;
temp = temp.childs[c];
}
return true;
}
}
/**
* 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);
*/
Reference
Subscribe via RSS