Skip to content

Commit 5d720e1

Browse files
committed
#256 implement-trie-prefix-trie solution
1 parent 8e6a0e1 commit 5d720e1

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
풀이 : 딕셔너리를 통해 트리구현
3+
- 생성자 함수는 맨 처음 노드를 만드는 역할, search("")를 위해 "ending":True로 초기화
4+
- insert함수를 수행하면 노드는 다음 문자에 대해서도 각각 노드를 가지고 있음
5+
ex) insert("a"); insert("b")
6+
{
7+
"ending":True,
8+
"a" :{"ending":True},
9+
"b" :{"ending":True}
10+
}
11+
- insert(): word의 순서대로 다음 문자의 노드(존재하지 않으면 {"ending":False}로 초기화)로 이동함
12+
for문 끝난 후 마지막 문자에서는 해당 노드로 끝나는 단어가 있다는 의미로 "ending":True로 수정
13+
14+
- search(): word 다음 문자의 노드로 이동하면서 존재하지 않으면 return False
15+
문자의 끝에 도달하면 끝나는 단어가 있는지 node["ending"] return
16+
17+
- startsWith(): prefix 다음 문자의 노드로 이동하면서 존재하지 않으면 return False
18+
문자의 끝에 도달하면 return True
19+
20+
TC : O(N)
21+
단어의 길이(N)에 비례한다
22+
SC : O(N)
23+
insert할 단어의 길이(N)에 비례해서 노드가 생성된다
24+
25+
- 딕셔너리가 아닌 class로 풀이할 수도 있다
26+
"""
27+
28+
class Trie:
29+
30+
def __init__(self):
31+
self.root = {"ending":True}
32+
33+
def insert(self, word: str) -> None:
34+
node = self.root
35+
for char in word:
36+
if char not in node:
37+
node[char] = {"ending": False}
38+
node = node[char]
39+
node["ending"] = True
40+
41+
def search(self, word: str) -> bool:
42+
node = self.root
43+
for char in word:
44+
if char in node:
45+
node = node[char]
46+
else:
47+
return False
48+
return node["ending"]
49+
50+
51+
def startsWith(self, prefix: str) -> bool:
52+
node = self.root
53+
for char in prefix:
54+
if char in node:
55+
node = node[char]
56+
else:
57+
return False
58+
return True
59+
60+
61+
# Your Trie object will be instantiated and called as such:
62+
# obj = Trie()
63+
# obj.insert(word)
64+
# param_2 = obj.search(word)
65+
# param_3 = obj.startsWith(prefix)

0 commit comments

Comments
 (0)