如何获得所有可能的单词?

时间:2013-04-30 12:01:24

标签: java search trie

我有一个方法可以在前缀树中找到所有可能的单词。它接收一个节点并找到该节点的所有可能单词。 但是,我需要它能够接受节点组合并找到组合的可能单词。 该方法将搜索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];  
    }  
}

2 个答案:

答案 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]);  
        }  
    }  
}

毋庸置疑,这是非常低效的。您可能希望在递归之前查看StringBuilderappend(char),并在从递归调用返回时查看removeCharAt(length-1)