Files
obsidian/АиСД/Задачи/LeetCode/Implement Trie (Prefix Tree).md
roma-dxunvrs 58a0ef65c4 10.09.26
2026-09-10 22:00:54 +03:00

2.1 KiB

Leetcode #208 | Medium | Design | Префиксные деревья

Идея

Храним TrieNode, в них хэш-мапы буква: следующая нода и флаг, который показывает является ли текущий префикс словом. Для всех действий заводим указатель, начиная с корня. Для добавления - если буква есть идем на нее, если нет добавляем букву в потомки, двигаем указатель на новую ноду. Для поиска - при первом отличии выходим, в конце возвращаем isWord(например, для слова dogs, search(dog) не должен вернуть true, так как это не конечный префиск). Для неточного поиска всегда возвращаем true.

Big-O

  • Время O(N)
  • Память O(T)

Код

class TrieNode {
    Map<Character, TrieNode> 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;
    }
}