Implement Trie (Prefix Tree)
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.
这题是一个很基本的字典树Trie例题。关于Trie, leetcode官网上有很清楚的介绍文章,这里我就直接附上链接leetcode_Tire。 Geeksforgeeks上关于Tire的介绍我也一并附上Geeksforgeeks_Tire。
这题主要就是先新建一个TireNode的class, 然后每个node都是一个26位的数组(26个字母),然后还有一个判断符。每次添加或者查找就一层层判断。其中添加完后,把判断符改为true,便于后期使用。
class Trie {
class TireNode{
public TireNode[] children;
public boolean isEnd;
public TireNode(){
children = new TireNode[26];
isEnd = false;
}
}
private TireNode root;
/** Initialize your data structure here. */
public Trie() {
root = new TireNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TireNode put = root;
for(int i = 0; i < word.length(); i++){
int input = word.charAt(i) - 'a';
if(put.children[input] == null){
put.children[input] = new TireNode();
}
put = put.children[input];
}
put.isEnd = true;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TireNode node = find(word);
return node != null && node.isEnd;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TireNode node = find(prefix);
return node != null;
}
public TireNode find(String prefix){
TireNode put = root;
for (int i = 0; i < prefix.length(); i++){
int input = prefix.charAt(i) - 'a';
if(put.children[input] == null){
return null;
}
put = put.children[input];
}
return put;
}
}