-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path208.实现-trie-前缀树.py
122 lines (109 loc) · 3.03 KB
/
208.实现-trie-前缀树.py
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
#
# @lc app=leetcode.cn id=208 lang=python3
#
# [208] 实现 Trie (前缀树)
#
# https://leetcode-cn.com/problems/implement-trie-prefix-tree/description/
#
# algorithms
# Medium (70.08%)
# Likes: 710
# Dislikes: 0
# Total Accepted: 106K
# Total Submissions: 148.6K
# Testcase Example: '["Trie","insert","search","search","startsWith","insert","search"]\n' +
'[[],["apple"],["apple"],["app"],["app"],["app"],["app"]]'
#
# Trie(发音类似 "try")或者说 前缀树
# 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。
#
# 请你实现 Trie 类:
#
#
# Trie() 初始化前缀树对象。
# void insert(String word) 向前缀树中插入字符串 word 。
# boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false
# 。
# boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true
# ;否则,返回 false 。
#
#
#
#
# 示例:
#
#
# 输入
# ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
# [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
# 输出
# [null, null, true, false, true, null, true]
#
# 解释
# Trie trie = new Trie();
# trie.insert("apple");
# trie.search("apple"); // 返回 True
# trie.search("app"); // 返回 False
# trie.startsWith("app"); // 返回 True
# trie.insert("app");
# trie.search("app"); // 返回 True
#
#
#
#
# 提示:
#
#
# 1
# word 和 prefix 仅由小写英文字母组成
# insert、search 和 startsWith 调用次数 总计 不超过 3 * 10^4 次
#
#
#
# @lc code=start
class TrieNode:
def __init__(self):
self.isWord = False
self.children = {}
class Trie:
def __init__(self):
"""
Initialize your data structure here.
"""
self.root = TrieNode()
def insert(self, word: str) -> None:
"""
Inserts a word into the trie.
"""
work = self.root
for c in word:
if c not in work.children:
work.children[c] = TrieNode()
work = work.children[c]
work.isWord = True
def search(self, word: str) -> bool:
"""
Returns if the word is in the trie.
"""
work = self.root
for c in word:
if c not in work.children:
return False
work = work.children[c]
return work.isWord
def startsWith(self, prefix: str) -> bool:
"""
Returns if there is any word in the trie that starts with the given prefix.
"""
work = self.root
for c in prefix:
if c not in work.children:
return False
work = work.children[c]
return True
# Your Trie object will be instantiated and called as such:
# obj = Trie()
# obj.insert(word)
# param_2 = obj.search(word)
# param_3 = obj.startsWith(prefix)
# @lc code=end