Skip to content

Commit f1a24c0

Browse files
authored
Update Implement Trie II (Prefix Tree).java
1 parent 34ebf07 commit f1a24c0

File tree

1 file changed

+46
-64
lines changed

1 file changed

+46
-64
lines changed

Medium/Implement Trie II (Prefix Tree).java

Lines changed: 46 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,64 @@
1-
class Trie {
1+
public class Trie {
22

3-
private Node head;
3+
private final TrieNode root;
44

5-
public Trie() {
6-
this.head = new Node('-');
7-
}
8-
9-
public void insert(String word) {
10-
Node curr = this.head;
11-
for (char c : word.toCharArray()) {
12-
if (!curr.children.containsKey(c)) {
13-
curr.children.put(c, new Node(c));
14-
}
15-
curr = curr.children.get(c);
5+
public Trie() {
6+
this.root = new TrieNode();
167
}
17-
curr.wordToFrequency.put(word, curr.wordToFrequency.getOrDefault(word, 0) + 1);
18-
}
198

20-
public int countWordsEqualTo(String word) {
21-
Node curr = this.head;
22-
curr = traverseTrie(curr, word);
23-
if (curr == null) {
24-
return 0;
9+
public void insert(String word) {
10+
TrieNode curr = root;
11+
for (char c : word.toCharArray()) {
12+
if (!curr.children.containsKey(c)) {
13+
curr.children.put(c, new TrieNode());
14+
}
15+
curr = curr.children.get(c);
16+
curr.startingWordCount++;
17+
}
18+
curr.completeWordCount++;
2519
}
26-
return curr.wordToFrequency.getOrDefault(word, 0);
27-
}
2820

29-
public int countWordsStartingWith(String prefix) {
30-
Node curr = this.head;
31-
curr = traverseTrie(curr, prefix);
32-
if (curr == null) {
33-
return 0;
21+
public int countWordsEqualTo(String word) {
22+
TrieNode endNode = searchWord(word);
23+
return endNode == null ? 0 : endNode.completeWordCount;
3424
}
35-
int count = 0;
36-
Queue<Node> queue = new LinkedList<>();
37-
queue.add(curr);
38-
while (!queue.isEmpty()) {
39-
Node removed = queue.remove();
40-
for (String word : removed.wordToFrequency.keySet()) {
41-
count += removed.wordToFrequency.get(word);
42-
}
43-
for (Character child : removed.children.keySet()) {
44-
queue.add(removed.children.get(child));
45-
}
25+
26+
public int countWordsStartingWith(String prefix) {
27+
TrieNode endNode = searchWord(prefix);
28+
return endNode == null ? 0 : endNode.startingWordCount;
4629
}
47-
return count;
48-
}
4930

50-
public void erase(String word) {
51-
Node curr = this.head;
52-
curr = traverseTrie(curr, word);
53-
if (curr == null || curr.wordToFrequency.getOrDefault(word, 0) == 0) {
54-
return;
31+
public void erase(String word) {
32+
TrieNode curr = root;
33+
for (char c : word.toCharArray()) {
34+
curr = curr.children.get(c);
35+
curr.startingWordCount--;
36+
}
37+
curr.completeWordCount--;
5538
}
56-
curr.wordToFrequency.put(word, curr.wordToFrequency.get(word) - 1);
57-
}
5839

59-
private Node traverseTrie(Node curr, String word) {
60-
for (char c : word.toCharArray()) {
61-
if (!curr.children.containsKey(c)) {
62-
return null;
63-
}
64-
curr = curr.children.get(c);
40+
private TrieNode searchWord(String word) {
41+
TrieNode curr = root;
42+
for (char c : word.toCharArray()) {
43+
if (!curr.children.containsKey(c)) {
44+
return null;
45+
}
46+
curr = curr.children.get(c);
47+
}
48+
return curr;
6549
}
66-
return curr;
67-
}
6850

69-
private static class Node {
70-
char c;
71-
Map<Character, Node> children;
72-
Map<String, Integer> wordToFrequency;
51+
private static class TrieNode {
52+
Map<Character, TrieNode> children;
53+
int completeWordCount;
54+
int startingWordCount;
7355

74-
public Node(char c) {
75-
this.c = c;
76-
this.children = new HashMap<>();
77-
this.wordToFrequency = new HashMap<>();
56+
public TrieNode() {
57+
this.children = new HashMap<>();
58+
this.completeWordCount = 0;
59+
this.startingWordCount = 0;
60+
}
7861
}
79-
}
8062
}
8163

8264
/**

0 commit comments

Comments
 (0)