|
5 | 5 | 3. At most 3 * 10^4 calls in total will be made to insert, search, and startsWith.
|
6 | 6 |
|
7 | 7 | Time Complexity:
|
8 |
| -- |
| 8 | +- insert: O(m), mμ μ
λ ₯ λ¨μ΄μ κΈΈμ΄ |
| 9 | +- search: O(m), mμ κ²μ λ¨μ΄μ κΈΈμ΄ |
| 10 | +- startsWith: O(m), mμ μ λμ¬μ κΈΈμ΄ |
9 | 11 |
|
10 | 12 | Space Complexity:
|
11 |
| -- |
| 13 | +- O(N*M), Nμ μ μ₯λ λ¨μ΄μ κ°μ, Mμ νκ· λ¨μ΄ κΈΈμ΄ |
12 | 14 |
|
13 | 15 | μ΄ν΄ν λ΄μ©:
|
14 | 16 | 1. Prefix(μ λμ¬)μ μλ―Έ
|
15 |
| - - λ¬Έλ²μ μ λμ¬(un-, pre- λ±)κ° μλ, λ¨μν λ¨μ΄μ μλΆλΆμ μλ λ¬Έμμ΄μ μλ―Έ |
| 17 | + - λ¬Έλ²μ μ λμ¬(un-, pre- λ±)κ° μλ |
| 18 | + - λ¨μν λ¨μ΄μ μλΆλΆμ μλ λ¬Έμμ΄μ μλ―Έ |
16 | 19 | - μ: "apple"μ μ λμ¬ -> "a", "ap", "app", "appl", "apple"
|
17 | 20 |
|
18 | 21 | 2. μ€ν λ°©μ
|
19 | 22 | - μ
λ ₯μΌλ‘ μ£Όμ΄μ§ λͺ
λ Ήμ΄λ₯Ό μμ°¨μ μΌλ‘ μ€ν
|
20 | 23 | - μ: ["Trie", "insert", "search"] μμλλ‘ μ€ν
|
21 | 24 | - κ° λͺ
λ Ήμ΄μ ν΄λΉνλ μΈμκ°λ μμλλ‘ μ μ©
|
22 | 25 |
|
23 |
| -3. μλ£κ΅¬μ‘° μ ν |
| 26 | +3. μλ£κ΅¬μ‘° μ ν (Trie with Hash Table) |
24 | 27 | - Trieμ κ° λ
Έλμμ μμ λ
Έλλ₯Ό μ μ₯ν λ ν΄μ ν
μ΄λΈ μ¬μ©
|
25 | 28 | - ν€: λ€μ λ¬Έμ, κ°: ν΄λΉ λ¬Έμμ TrieNode
|
26 | 29 | - μ₯μ : λ€μ λ¬Έμ κ²μμ΄ O(1)λ‘ κ°λ₯
|
| 30 | +
|
| 31 | +Notes: |
| 32 | +- νΌμ ꡬννκΈ° μ΄λ €μμ, 곡λΆν λ΄μ©μ μ λ¦¬λ§ νμ΅λλ€. |
| 33 | +""" |
| 34 | + |
| 35 | +# νΈλ¦¬μ κ° "λ
Έλ(λ§λ)"λ₯Ό νννλ ν΄λμ€ |
| 36 | +class TrieNode: |
| 37 | + def __init__(self): |
| 38 | + # childrenμ "λ€μ κΈμλ€μ μ μ₯νλ 곡κ°" |
| 39 | + # μ: 'a' λ€μμ 'p'κ° μ¬ μ μλ€λ©΄ children['p']μ μ μ₯ |
| 40 | + self.children = {} |
| 41 | + |
| 42 | + # is_endλ "μ¬κΈ°κΉμ§κ° νλμ λ¨μ΄κ° λλμ§"λ₯Ό νμ |
| 43 | + # μ: "app"μ μ μ₯νλ€λ©΄, pλ
Έλμ is_endκ° True |
| 44 | + self.is_end = False |
| 45 | + |
| 46 | +# νΈλ¦¬ μ 체λ₯Ό κ΄λ¦¬νλ ν΄λμ€ |
| 47 | +class Trie: |
| 48 | + def __init__(self): |
| 49 | + # νΈλ¦¬μ μμμ μμ± |
| 50 | + # μ€μ κΈμλ€μ root λ°μμλΆν° μμ |
| 51 | + self.root = TrieNode() |
| 52 | + |
| 53 | + # μλ‘μ΄ λ¨μ΄λ₯Ό νΈλ¦¬μ μΆκ°νλ ν¨μ |
| 54 | + def insert(self, word: str) -> None: |
| 55 | + node = self.root |
| 56 | + for char in word: |
| 57 | + if char not in node.children: |
| 58 | + node.children[char] = TrieNode() |
| 59 | + node = node.children[char] |
| 60 | + node.is_end = True |
| 61 | + |
| 62 | + # λ¨μ΄κ° νΈλ¦¬μ μλμ§ μ°Ύλ ν¨μ |
| 63 | + def search(self, word: str) -> bool: |
| 64 | + node = self.root |
| 65 | + for char in word: |
| 66 | + if char in node.children: |
| 67 | + node = node.children[char] |
| 68 | + else: |
| 69 | + return False |
| 70 | + return node.is_end |
| 71 | + |
| 72 | + # ν΄λΉ μ λμ¬λ‘ μμνλ λ¨μ΄κ° μλμ§ νμΈνλ ν¨μ |
| 73 | + def startsWith(self, prefix: str) -> bool: |
| 74 | + node = self.root |
| 75 | + for char in prefix: |
| 76 | + if char in node.children: |
| 77 | + node = node.children[char] |
| 78 | + else: |
| 79 | + return False |
| 80 | + return True |
| 81 | + |
| 82 | +""" |
| 83 | +μ¬μ© μμ: |
| 84 | +trie = Trie() |
| 85 | +trie.insert("apple") # "apple" μ μ₯ |
| 86 | +trie.search("apple") # True λ°ν (appleμ΄ μμ) |
| 87 | +trie.search("app") # False λ°ν (appμ μμ) |
| 88 | +trie.startsWith("app") # True λ°ν (appμΌλ‘ μμνλ λ¨μ΄κ° μμ) |
27 | 89 | """
|
0 commit comments