/
_0208_ImplementTriePrefixTree.java
132 lines (121 loc) · 3.91 KB
/
_0208_ImplementTriePrefixTree.java
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.diguage.algorithm.leetcode;
import java.util.Arrays;
import java.util.Objects;
/**
* = 208. Implement Trie (Prefix Tree)
*
* https://leetcode.com/problems/implement-trie-prefix-tree/[Implement Trie (Prefix Tree) - LeetCode]
*
* Implement a trie with `insert`, `search`, and `startsWith` methods.
*
* .Example:
* [source,java]
* ----
* 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.
*
* @author D瓜哥, https://www.diguage.com/
* @since 2020-01-26 19:47
*/
public class _0208_ImplementTriePrefixTree {
/**
* Runtime: 69 ms, faster than 11.59% of Java online submissions for Implement Trie (Prefix Tree).
*
* Memory Usage: 62.6 MB, less than 5.77% of Java online submissions for Implement Trie (Prefix Tree).
*/
class Trie {
private int ALPHABET_SIZE = 26;
class TrieNode {
private TrieNode[] alphabet;
private boolean isEnd;
public TrieNode() {
this.alphabet = new TrieNode[ALPHABET_SIZE];
Arrays.fill(this.alphabet, null);
this.isEnd = false;
}
}
private TrieNode[] root;
/**
* Initialize your data structure here.
*/
public Trie() {
this.root = new TrieNode[ALPHABET_SIZE];
Arrays.fill(this.root, null);
}
/**
* Inserts a word into the trie.
*/
public void insert(String word) {
char[] chars = word.toCharArray();
TrieNode[] current = this.root;
for (int i = 0; i < chars.length; i++) {
int index = chars[i] - 'a';
if (Objects.isNull(current[index])) {
current[index] = new TrieNode();
}
if (i == chars.length - 1) {
current[index].isEnd = true;
}
current = current[index].alphabet;
}
}
/**
* Returns if the word is in the trie.
*/
public boolean search(String word) {
char[] chars = word.toCharArray();
TrieNode[] current = this.root;
for (int i = 0; i < chars.length; i++) {
int index = chars[i] - 'a';
if (Objects.isNull(current[index])) {
return false;
}
if (i == chars.length - 1) {
return current[index].isEnd;
}
current = current[index].alphabet;
}
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[] current = this.root;
for (int i = 0; i < chars.length; i++) {
int index = chars[i] - 'a';
if (Objects.isNull(current[index])) {
return false;
}
current = current[index].alphabet;
}
return true;
}
}
private void test() {
Trie trie = new Trie();
trie.insert("apple");
System.out.println(trie.search("apple"));
System.out.println(!trie.search("app"));
System.out.println(trie.startsWith("app"));
trie.insert("app");
System.out.println(trie.search("app"));
}
public static void main(String[] args) {
_0208_ImplementTriePrefixTree solution = new _0208_ImplementTriePrefixTree();
solution.test();
}
}