收集带有前缀的Trie中的所有单词

时间:2019-03-18 19:38:46

标签: java data-structures trie

我正在尝试实现一种方法,该方法将所有单词存储在Java列表中的Trie数据结构中。这是我的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中存储了单词“ beard”,“ bold”,“ brew”,则在打印以前缀“ b”开头的单词列表时,我得到:

[beard, beold, beorew]

我期望的是

[beard, bold, brew]

我想我需要一种方法,使我在找到一个单词时就可以重置该字符串单词,而不是在后面添加下一个字符。

0 个答案:

没有答案