实现 Trie
题目
实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法。
注意事项
你可以假设所有的输入都是小写字母a-z。样例
insert(“lintcode”)
search(“code”) // return false
startsWith(“lint”) // return true
startsWith(“linterror”) // return false
insert(“linterror”)
search(“lintcode) // return true
startsWith(“linterror”) // return true题解
本题是字典树的构造:
1.root节点不包含字符。
2.任意节点都可以有26个子节点,每个节点(root除外)的值只能是一个字符。
3.应注意在insert一个字符串以后在最后一个节点进行单词标记。
/**
* Your Trie object will be instantiated and called as such:
* Trie trie = new Trie();
* trie.insert("lintcode");
* trie.search("lint"); will return false
* trie.startsWith("lint"); will return true
*/
class TrieNode
{
private TrieNode[] children;
public boolean hasWord;
// Initialize your data structure here.
public TrieNode()
{
children = new TrieNode[26];
hasWord = false;
}
public void insert(String word, int index)
{
if (index == word.length())
{
this.hasWord = true;
return;
}
int pos = word.charAt(index) - 'a';
if (children[pos] == null)
{
children[pos] = new TrieNode();
}
children[pos].insert(word, index + 1);
}
public TrieNode find(String word, int index)
{
if (index == word.length())
{
return this;
}
int pos = word.charAt(index) - 'a';
if (children[pos] == null)
{
return null;
}
return children[pos].find(word, index + 1);
}
}
public class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
root.insert(word, 0);
}
// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode node = root.find(word, 0);
return (node != null && node.hasWord);
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode node = root.find(prefix, 0);
return node != null;
}
}
Last Update 2016.11.18