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; } } ```