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.
本题考查的前缀树的知识点,个人觉得该题的Solution写得特别好。
照例贴代码如下:
/**
* 208. Implement Trie (Prefix Tree)
* 前缀树的节点定义
*/
class TrieNode {
private TrieNode[] links;//最多有26个子节点
private final int MAX_NODE = 26;
private boolean isEnd;//判断该节点是否是尾结点(即是否存在从根节点到该节点的单词)
public TrieNode() {
links = new TrieNode[MAX_NODE];
}
public boolean containsKey(char ch) {
return links[ch-'a'] != null;
}
public TrieNode get(char ch) {
return links[ch-'a'];
}
public void put(char ch, TrieNode node) {
links[ch-'a'] = node;
}
public boolean isEnd() {
return isEnd;
}
public void setEnd(boolean end) {
isEnd = end;
}
}
class Trie {
private TrieNode root;//前缀树的根节点
/** Initialize your data structure here. */
public Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TrieNode node = root;
for(int i = 0; i < word.length(); ++i) {
char ch = word.charAt(i);
if(!node.containsKey(ch)) {
node.put(ch, new TrieNode());
}
node = node.get(ch);
}
node.setEnd(true);
}
private TrieNode searchPrefix(String word) {
TrieNode node = root;
for(int i = 0; i < word.length(); ++i) {
char ch = word.charAt(i);
if(node.containsKey(ch)) {
node = node.get(ch);
} else {
return null;
}
}
return node;
}
/** Returns if the word is in the trie. */
public boolean search(String word) {
TrieNode node = searchPrefix(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) {
TrieNode node = searchPrefix(prefix);
return node != null;
}
}