我有一个方法可以在前缀树中找到所有可能的单词。它接收一个节点并找到该节点的所有可能单词。 但是,我需要它能够接受节点组合并找到组合的可能单词。 该方法将搜索trie,其中填充有单词词典。 例如,不是从带有前缀“a”的一个字母中找到所有可能的单词,它可以从前缀“ab”或“abo”中找到所有可能的单词。 我只是不知道如何使用节点组合进行搜索,而不是仅从一个节点进行搜索。
public void findWords(Node node) {
if(node == null) return;
//searches through the branches of the node
// R is 26(the branches from each node on the trie)
// each one being a letter of the alphabet.
for(int i = 0; i < R; i++) {
if(node.next[i] != null) {
//printing each character
System.out.print((char) (97 + i));
//identifying letter combo
if(node.next[i].isWord == true) {
System.out.println();
}
//back into the loop
findWords(node.next[i]);
}
}
}
节点类:
public class TextPredictTrie {
private final int R = 26; // the trie branches
private Node root = new Node(); // the root node
// the t9 mapped array which maps number to string on the typing board
private String[] t9 = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
// trie node definition
private class Node {
private boolean isWord;
private Node[] next;
public Node() {
this(false);
}
public Node(boolean isWord) {
this.isWord = isWord;
this.next = new Node[R];
}
}
答案 0 :(得分:1)
这对你有用吗?作为Node的一种方法。
public List<String> findWords() {
List<String> result = new ArrayList<String>();
if(this.isWord)
result.add("");
for(int i = 0; i < R; i++)
if(next[i] != null){
List<String> childResult = next[i].findWords();
char letter = (char) (97 + i);
for(String sufix : childResult)
result.add("" + letter + sufix);
}
return result;
}
答案 1 :(得分:1)
我真的不明白你的问题,但你所做的事情似乎首先是错误的,因为一旦输出换行符,你就会失去搜索路径的完整前缀。您应该将findWords(Node node)
的签名更改为findWords(String prefix, Node node)
,以便维护前缀。我还建议稍微重组一下该方法:
public void findWords(String prefix, Node node) {
if(node == null) return;
if(node.isWord) // Check here
System.out.println(prefix);
//searches through the branches of the node
// R is 26(the branches from each node on the trie)
// each one being a letter of the alphabet.
for(int i = 0; i < R; i++) {
if(node.next[i] != null) {
// append next character to prefix
findWords(prefix + ('a' + i), node.next[i]);
}
}
}
毋庸置疑,这是非常低效的。您可能希望在递归之前查看StringBuilder
类append(char)
,并在从递归调用返回时查看removeCharAt(length-1)
。