问题描述:
Implement a trie with insert, search, and startsWith methods.
分析:题目要求实现一个单词树,首先注意,单词树中每个节点存储一个单词,同时还要一个指向下个节点的索引,所以构成26个TrieNode数组。
在本数据结构中,每个节点并没有存储所表示的字符,因为每个节点的字符信息可以从上一层节点中获取。相反需要存储一个表示是否为结束的标示。isEnd,如果为true,表示字符串到上个节点终止。
代码如下:528ms
class TrieNode {
// Initialize your data structure here.
boolean isEnd;
TrieNode[] nodes;
public TrieNode() {
isEnd = false;
nodes = new TrieNode[26];
}
}
public class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
public void insert(String word) {
char[] chars = word.toCharArray();
TrieNode tmpNode = root;
for(int i = 0;i<chars.length;i++){
char cur = chars[i];
int index = cur-'a';
if(tmpNode.nodes[index]==null)
tmpNode.nodes[index] = new TrieNode();
tmpNode = tmpNode.nodes[index];
}
tmpNode.isEnd = true;
}
// Returns if the word is in the trie.
public boolean search(String word) {
char[] chars = word.toCharArray();
TrieNode tmpNode = root;
for(int i =0;i<chars.length;i++){
char cur = chars[i];
int index = cur-'a';
if(tmpNode.nodes[index]==null)
return false;
tmpNode = tmpNode.nodes[index];
}
if(tmpNode.isEnd)
return true;
return false;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
char[] chars = prefix.toCharArray();
TrieNode tmpNode = root;
for(int i =0;i<chars.length;i++){
char cur = chars[i];
int index = cur-'a';
if(tmpNode.nodes[index]==null)
return false;
tmpNode = tmpNode.nodes[index];
}
for(int i = 0;i<26;i++){
if(tmpNode.isEnd || tmpNode.nodes[i]!=null)
return true;
}
return false;
}
}