LeetCode 筆記 - 208. Implement Trie (Prefix Tree)

挑戰 LeetCode 208 題,實作字典樹 (Trie) 的核心功能。本文詳細介紹 TrieNode 的節點設計,並逐步實作 insert、search 與 startsWith 等方法,分析這類資料結構在處理大量字串前綴搜尋時的效率優勢。

發佈
閱讀
約 1 分鐘
字數
460

題目在此 208. Implement Trie (Prefix Tree)

就是實作 Trie 的基本功能,包含 insert, search, startsWith 三個方法。

解題思維

這題就是實作 Trie 的基本功能,這邊我們用一個 class TrieNone 來代表 Trie 的節點,然後再用 Trie 來實作 insert, search, startsWith 三個方法。

在這裡我們先來定義一個 TrieNone 的 class,這個 class 有兩個屬性,childs 代表子節點,is_end 代表是否為結尾。

1
2
3
4
class TrieNone:
def __init__(self):
self.childs = {}
self.is_end = False

insert 就是按照資料建立節點,如果節點不存在就建立,最後一個節點的 is_end 設為 True。

search 就是從根節點開始,一個一個比對節點是否存在,如果不存在就回傳 False,如果最後一個節點的 is_end 為 True 就回傳 True。因為 search 需要完整的字串都存在,所以不用擔心前綴字串的問題。

startsWith 跟 search 很像,差異在於最後需不需要檢查 is_end,因為 startsWith 只需要前綴字串存在即可。

以下是插入 apple, app 之後資料結構的樣子:

我們可以觀察到,兩個有一樣的前綴 app,但是 apple 有 is_end,app 沒有,而且還共用了同樣的 prefix app。

圖:LeetCode 筆記 - 208. Implement Trie (Prefix Tree)

程式碼

以下為完整程式碼:

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
class TrieNone:
def __init__(self):
self.childs = {}
self.is_end = False

class Trie:

def __init__(self):
self.root = TrieNone()

def insert(self, word: str) -> None:

node = self.root
for w in word:
if w not in node.childs:
node.childs[w] = TrieNone()

node = node.childs[w]

node.is_end = True

def search(self, word: str) -> bool:
node = self.root

for w in word:
if w not in node.childs:
return False

node = node.childs[w]

return node.is_end

def startsWith(self, prefix: str) -> bool:

node = self.root

for w in prefix:
if w not in node.childs:
return False

node = node.childs[w]

return True

也許你也會想看看

輸入關鍵字開始搜尋 · ↑↓ 選擇 · Enter 開啟