Соберите все слова в Trie с префиксом - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь реализовать метод, который будет хранить все слова в структуре данных Trie в списке в Java.Это мой класс Node:

class Node {
    char c;
    HashMap<Character, Node> children = new HashMap<Character, Node>();
    boolean isCompleteWord;

    public Node(char c) {
        this.c = c;
        isCompleteWord = false;
    }
    public Node() {
    }
}

Я использую HashMap для хранения дочерних символов в качестве ключей и дочерних узлов в качестве значений.Узлу, завершающему слово, будет присвоено поле isCompleteWord значение true.

Методы добавления всех слов в список:

List<String> collectWords(char c) {
    List<String> words = new ArrayList<>();
    String word = Character.toString(c);
    Node node = root.children.get(c);
    collectWordsHelper(words, node, word);
    return words;
}

void collectWordsHelper(List<String> words, Node node, String word) {
    for (char i = 'a'; i <= 'z'; i++) {
        if (node.children.containsKey(i)) {
            System.out.println(i); // prints the right letters
            Node child = node.children.get(i);
            word += i;
            if (child.isCompleteWord && !words.contains(word)) {
                words.add(word);
                collectWordsHelper(words, child, "");
            }
            collectWordsHelper(words, child, word);
        }
    }
}

В настоящее время, если я сохранил в Trie слова "борода "," жирный "," варево ", когда я печатаю список слов, начинающихся с префикса" b ", я получаю:

[beard, beold, beorew]

Что я ожидаю:

[beard, bold, brew]

Я думаю, мне нужен способ сброса строкового слова всякий раз, когда я нашел слово, вместо добавления следующих символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...