Skip to content

Commit 03c5364

Browse files
committed
二刷208
1 parent 767ff00 commit 03c5364

File tree

4 files changed

+131
-23
lines changed

4 files changed

+131
-23
lines changed

Diff for: docs/0208-implement-trie-prefix-tree.adoc

+52-23
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,76 @@
11
[#0208-implement-trie-prefix-tree]
2-
= 208. Implement Trie (Prefix Tree)
2+
= 208. 实现 Trie (前缀树)
33

4-
{leetcode}/problems/implement-trie-prefix-tree/[LeetCode - Implement Trie (Prefix Tree)^]
4+
https://leetcode.cn/problems/implement-trie-prefix-tree/[LeetCode - 208. 实现 Trie (前缀树) ^]
55

6-
没想到 Trie Tree 实现起来一点也不复杂!
7-
8-
思考题:如何实现一个工业级的 Trie Tree?
6+
*link:https://baike.baidu.com/item/字典树/9825209?fr=aladdin[Trie]*(发音类似 "try")或者说 *前缀树* 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
97

10-
image::images/0208-1.png[{image_attr}]
8+
请你实现 Trie 类:
119

12-
== 参考资料
10+
* `Trie()` 初始化前缀树对象。
11+
* `void insert(String word)` 向前缀树中插入字符串 `word`
12+
* `boolean search(String word)` 如果字符串 `word` 在前缀树中,返回 `true`(即,在检索之前已经插入);否则,返回 `false`
13+
* `boolean startsWith(String prefix)` 如果之前已经插入的字符串 `word` 的前缀之一为 `prefix` ,返回 `true` ;否则,返回 `false`
1314
14-
. https://en.wikipedia.org/wiki/Trie[Trie - Wikipedia^]
15-
. https://www.geeksforgeeks.org/trie-insert-and-search/[Trie | (Insert and Search) - GeeksforGeeks^]
1615
17-
Implement a trie with `insert`, `search`, and `startsWith` methods.
16+
*示例:*
1817

19-
*Example:*
18+
....
19+
输入
20+
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
21+
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
22+
输出
23+
[null, null, true, false, true, null, true]
2024
21-
[subs="verbatim,quotes,macros"]
22-
----
25+
解释
2326
Trie trie = new Trie();
24-
2527
trie.insert("apple");
26-
trie.search("apple"); // returns true
27-
trie.search("app"); // returns false
28-
trie.startsWith("app"); // returns true
29-
trie.insert("app");
30-
trie.search("app"); // returns true
31-
----
28+
trie.search("apple"); // 返回 True
29+
trie.search("app"); // 返回 False
30+
trie.startsWith("app"); // 返回 True
31+
trie.insert("app");
32+
trie.search("app"); // 返回 True
33+
....
3234

33-
*Note:*
35+
*提示:*
3436

37+
* `+1 <= word.length, prefix.length <= 2000+`
38+
* `word``prefix` 仅由小写英文字母组成
39+
* `insert``search``startsWith` 调用次数 *总计* 不超过 `3 * 10^4^`
3540
36-
* You may assume that all inputs are consist of lowercase letters `a-z`.
37-
* All inputs are guaranteed to be non-empty strings.
41+
== 思路分析
3842

43+
没想到 Trie Tree 实现起来一点也不复杂!
3944

45+
思考题:如何实现一个工业级的 Trie Tree?
46+
47+
image::images/0208-1.png[{image_attr}]
4048

4149

4250
[[src-0208]]
51+
[tabs]
52+
====
53+
一刷::
54+
+
55+
--
4356
[{java_src_attr}]
4457
----
4558
include::{sourcedir}/_0208_ImplementTriePrefixTree.java[tag=answer]
4659
----
60+
--
61+
62+
二刷::
63+
+
64+
--
65+
[{java_src_attr}]
66+
----
67+
include::{sourcedir}/_0208_ImplementTriePrefixTree_2.java[tag=answer]
68+
----
69+
--
70+
====
71+
72+
== 参考资料
73+
74+
. https://en.wikipedia.org/wiki/Trie[Trie - Wikipedia^]
75+
. https://www.geeksforgeeks.org/trie-insert-and-search/[Trie | (Insert and Search) - GeeksforGeeks^]
4776

Diff for: logbook/202503.adoc

+5
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ endif::[]
125125
|{doc_base_url}/0025-reverse-nodes-in-k-group.adoc[题解]
126126
|✅ 分段递归反转,在拼接
127127

128+
|{counter:codes2503}
129+
|{leetcode_base_url}/implement-trie-prefix-tree/[208. 实现 Trie (前缀树)^]
130+
|{doc_base_url}/0208-implement-trie-prefix-tree.adoc[题解]
131+
|✅ 竟然一次通过
132+
128133
|===
129134

130135
截止目前,本轮练习一共完成 {codes2503} 道题。

Diff for: src/main/java/com/diguage/algo/leetcode/_0208_ImplementTriePrefixTree.java

+3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public class _0208_ImplementTriePrefixTree {
3737
* Runtime: 69 ms, faster than 11.59% of Java online submissions for Implement Trie (Prefix Tree).
3838
*
3939
* Memory Usage: 62.6 MB, less than 5.77% of Java online submissions for Implement Trie (Prefix Tree).
40+
*
41+
* @author D瓜哥 · https://www.diguage.com
42+
* @since 2020-01-26 19:47
4043
*/
4144
class Trie {
4245
private int ALPHABET_SIZE = 26;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
public class _0208_ImplementTriePrefixTree_2 {
7+
// tag::answer[]
8+
9+
/**
10+
* 没想到竟然一次通过,😁
11+
*
12+
* @author D瓜哥 · https://www.diguage.com
13+
* @since 2025-04-02 19:42:48
14+
*/
15+
class Trie {
16+
private Map<Character, Node> trie;
17+
18+
public Trie() {
19+
trie = new HashMap<>();
20+
}
21+
22+
public void insert(String word) {
23+
Map<Character, Node> curr = trie;
24+
Node node = null;
25+
for (int i = 0; i < word.length(); i++) {
26+
char c = word.charAt(i);
27+
node = curr.get(c);
28+
if (node == null) {
29+
node = new Node(c);
30+
curr.put(c, node);
31+
}
32+
curr = node.children;
33+
}
34+
node.isEnd = true;
35+
}
36+
37+
public boolean search(String word) {
38+
Node node = searchPrefix(word);
39+
return node != null && node.isEnd;
40+
}
41+
42+
public boolean startsWith(String prefix) {
43+
return searchPrefix(prefix) != null;
44+
}
45+
46+
private Node searchPrefix(String word) {
47+
Map<Character, Node> curr = trie;
48+
Node node = null;
49+
for (int i = 0; i < word.length(); i++) {
50+
char c = word.charAt(i);
51+
node = curr.get(c);
52+
if (node == null) {
53+
return null;
54+
}
55+
curr = node.children;
56+
}
57+
return node;
58+
}
59+
60+
private static class Node {
61+
char data;
62+
boolean isEnd;
63+
Map<Character, Node> children = new HashMap<>();
64+
65+
public Node(char data) {
66+
this.data = data;
67+
}
68+
}
69+
}
70+
// end::answer[]
71+
}

0 commit comments

Comments
 (0)