【Leetcode解題】208. Implement Trie (Prefix Tree)
題目
- 題目連結
- 目標函式 :
Trie()void insert(String word)boolean search(String word)boolean startsWith(String prefix)
解題概念
- 題意 : 需要實作
TrieclassTrie(): 對Trie進行初始化void insert(String word): 插入字串word到Trie中boolean search(String word): 判斷字串word是否儲存在Trie中boolean startsWith(String prefix): 判斷Trie中的字串是否有prefix
我的寫法
- 想法 : 直接使用一個陣列去儲存字串就好
- 在
startsWith()中,針對Trie中每個字串w去判斷prefix == w[:len(prefix)]
- 在
- 程式碼 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Trie(object):
def __init__(self):
self.t_list = []
def insert(self, word):
self.t_list.append(word)
def search(self, word):
return word in self.t_list
def startsWith(self, prefix):
for w in self.t_list:
if prefix == w[:len(prefix)]:
return True
return False - 成效 :
- Time Complexity : $O(n)$
- Runtime: 810 ms (faster than 5.1%)
- Memory Usage: 21.2 MB (more than 96.74%)
解答 or 其他優秀寫法
想法 : 使用 Tree 去表示
Trie Tree,其中原本使用 Node 去儲存,但這裡改使用dict以減省空間dict儲存格式 :{"a" : {"p" : {"p" : {"$" : ""}}}}- 其中使用
{"$" : ""}當作 Leaf 的表示方法
- 其中使用
- 詳細說明請見程式碼

程式碼 :
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
43class Trie(object):
def __init__(self):
self.root = {}
def insert(self, word):
# 從 root 開始搜尋
ptr = self.root
for char in word:
# 若發現 char 與目前 ptr 不同,則要新創分支
if char not in ptr:
ptr[char] = {}
# ptr 向下一格
ptr = ptr[char]
# 將 Leaf 設定好
ptr["$"] = ""
def search(self, word):
# 從 root 開始搜尋
ptr = self.root
for char in word:
# 若發現 char 與目前 ptr 不同
if char not in ptr:
return False # 則代表 word 不存在 Trie Tree 中
# ptr 向下一格
ptr = ptr[char]
return "$" in ptr # 判斷當前 ptr 是否已到達 Leaf
def startsWith(self, prefix):
# 從 root 開始搜尋
ptr = self.root
for char in prefix:
# 若發現 char 在 ptr 中無此分支
if char not in ptr:
return False # 代表無此 prefix
# ptr 向下一格
ptr = ptr[char]
return True成效 :
- Time Complexity : $O(\log n)$
- Runtime: 93 ms (faster than 96.87%)
- Memory Usage: 29.9 MB (more than 29.9%)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Robin's Tech Blog!


