我正在尝试实现一种方法,该方法将所有单词存储在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]
我想我需要一种方法,使我在找到一个单词时就可以重置该字符串单词,而不是在后面添加下一个字符。