实现字典树 (前缀树)

题目描述

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。

说明:
你可以假设所有的输入都是由小写字母 a-z 构成的。保证所有输入均为非空字符串。

示例

1
2
3
4
5
6
7
8
Trie trie = new Trie();

trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

public 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 tn = root;

char[] chars = word.toCharArray();

for(char c : chars){
if(tn.children[c - 'a'] == null){
tn.children[c - 'a'] = new TrieNode(c);
}
tn = tn.children[c - 'a'];
}
tn.isWord = true;
}

/** Returns if the word is in the trie. */
public boolean search(String word) {

TrieNode tn = root;

char[] chars = word.toCharArray();

for(char c : chars){
if(tn.children[c - 'a'] == null){
return false;
}else{
tn = tn.children[c - 'a'];
}
}

return tn.isWord;
}

/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {

TrieNode tn = root;

char[] chars = prefix.toCharArray();

for(char c : chars){
if(tn.children[c - 'a'] == null){
return false;
}else{
tn = tn.children[c - 'a'];
}
}

return true;
}
}

class TrieNode {

public char val;
public boolean isWord;
public TrieNode[] children = new TrieNode[26];

public TrieNode(){};

TrieNode(char c){
TrieNode node = new TrieNode();
node.val = c;
}
}

由于默认只输入小写字母,因此直接将每个节点的子节点定位为26个,按a-z顺序依次存储,省去了子节点字母遍历的麻烦。