diff --git a/АиСД/Задачи/LeetCode/Implement Trie (Prefix Tree).md b/АиСД/Задачи/LeetCode/Implement Trie (Prefix Tree).md new file mode 100644 index 0000000..2f98609 --- /dev/null +++ b/АиСД/Задачи/LeetCode/Implement Trie (Prefix Tree).md @@ -0,0 +1,54 @@ +Leetcode #208 | Medium | [[Design]] | [[Префиксные деревья]] +## Идея +Храним `TrieNode`, в них хэш-мапы `буква: следующая нода` и флаг, который показывает является ли текущий префикс словом. Для всех действий заводим указатель, начиная с корня. Для добавления - если буква есть идем на нее, если нет добавляем букву в потомки, двигаем указатель на новую ноду. Для поиска - при первом отличии выходим, в конце возвращаем `isWord`(например, для слова `dogs`, `search(dog)` не должен вернуть `true`, так как это не конечный префиск). Для неточного поиска всегда возвращаем `true`. +## [[Big-O]] +- Время ```O(N)``` +- Память ```O(T)``` +## Код +```Java +class TrieNode { + Map children = new HashMap<>(); + boolean isWord; +} + +class PrefixTree { + TrieNode root = new TrieNode(); + + public PrefixTree() { + + } + + public void insert(String word) { + TrieNode cur = root; + for (char c: word.toCharArray()) { + if (!cur.children.containsKey(c)) { + cur.children.put(c, new TrieNode()); + } + cur = cur.children.get(c); + } + cur.isWord = true; + } + + public boolean search(String word) { + TrieNode cur = root; + for (char c: word.toCharArray()) { + if (!cur.children.containsKey(c)) { + return false; + } + cur = cur.children.get(c); + } + return cur.isWord; + } + + public boolean startsWith(String prefix) { + TrieNode cur = root; + for (char c: prefix.toCharArray()) { + if (!cur.children.containsKey(c)) { + return false; + } + cur = cur.children.get(c); + } + return true; + } +} +``` \ No newline at end of file diff --git a/АиСД/План.md b/АиСД/План.md deleted file mode 100644 index df87eaa..0000000 --- a/АиСД/План.md +++ /dev/null @@ -1,34 +0,0 @@ -🎯 2. План подготовки: Что повторить и Что решить в первый раз - -Разбиваем подготовку на 5 ключевых блоков: -Блок 1. Проектирование структур и ООП (Почти 100% будет на 2-м этапе!) - - 🔄 Обязательно повторить: LRU Cache (LeetCode #146 - Medium) — напиши его на Java с нуля с left/right стражниками! - - 🔄 Повторить: Insert Delete GetRandom O(1) (LeetCode #380 - Medium) — ArrayList + HashMap. - - 🆕 Решить в первый раз: Design Hit Counter (LeetCode #362 - Medium) — ArrayDeque за 300 секунд. - -Блок 2. Монотонный Стек (Фирменный стиль Яндекса) - - 🆕 Решить в первый раз: Daily Temperatures (LeetCode #739 - Medium) — идеальная вводная в монотонный стек! - -Блок 3. Графы и Дейкстра - - 🔄 Повторить: Course Schedule I & II (LeetCode #207/210 - Medium) — Алгоритм Кана (BFS с indegree). - - 🆕 Решить в первый раз: Network Delay Time (LeetCode #743 - Medium) — Алгоритм Дейкстры на Java через PriorityQueue. - -Блок 4. Префиксные суммы и Математика остатков - - 🔄 Повторить: Subarray Sum Equals K (LeetCode #560 - Medium) — pref - k в HashMap. - - 🔄 Повторить: Continuous Subarray Sum (LeetCode #523 - Medium) — pref % k в HashMap. - -Блок 5. Отрезки и Бинпоиск - - 🔄 Повторить: Merge Intervals (LeetCode #56 - Medium) — с List и res.toArray(new int[0][0]) на Java. - - 🔄 Повторить: Search in Rotated Sorted Array (LeetCode #33 - Medium) — двухпроходный бинпоиск по Маврину. - -Best Time to Buy and Sell Stock II diff --git a/АиСД/Список задач.md b/АиСД/Список задач.md index 6c0ab0f..209fb46 100644 --- a/АиСД/Список задач.md +++ b/АиСД/Список задач.md @@ -71,4 +71,5 @@ Maximal Rectangle [[Maximum Subarray]] [[Course Schedule II]] [[Best Time to Buy and Sell Stock]] -[[Best Time to Buy and Sell Stock II]] \ No newline at end of file +[[Best Time to Buy and Sell Stock II]] +[[Implement Trie (Prefix Tree)]] \ No newline at end of file diff --git a/АиСД/Структуры/Префиксные деревья.md b/АиСД/Структуры/Префиксные деревья.md new file mode 100644 index 0000000..04d7570 --- /dev/null +++ b/АиСД/Структуры/Префиксные деревья.md @@ -0,0 +1 @@ +[[Деревья]] [[Префикс]] [[Графы]] \ No newline at end of file