使用Trie数据结构查找带前缀的单词数

时间:2017-06-22 09:50:10

标签: java algorithm trie

我正在使用Trie在Hackerrank上尝试Contacts问题。我使用了迭代方法。提交代码后,除了下面列出的测试用例外,所有测试用例都已通过。

这是我的代码

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;

class TrieNode{
    HashMap<Character,TrieNode> children;
    boolean endOfWord;
    int size=0;
    TrieNode(){
        children=new HashMap<Character, TrieNode>();
        endOfWord=false;
    }
}
public class ContactsUsingTrie {
    TrieNode root;
    ContactsUsingTrie(){
        root=new TrieNode();
    }
    public void insert(String word){

        TrieNode current=root;
        TrieNode node;

        for(int i=0;i<word.length();i++){
            current.size++;
            Character ch=word.charAt(i);
        node=current.children.get(ch);
        if(node==null){
            node=new TrieNode();
            current.children.put(ch, node);
        }       
        current=node;
        }
        current.endOfWord=true;
    }

    public int find(String partial){
        TrieNode current=root;
        TrieNode node;
        for(int i=0;i<partial.length();i++){
            Character ch=partial.charAt(i);
            node=current.children.get(ch);
            if(node==null){
                return 0;
            }
            current=node;
            }

        return current.size;
    }
    public static void main(String[] args) {
        ContactsUsingTrie trie=new ContactsUsingTrie();
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in) );
        String str[];
        try {
            int T=Integer.parseInt(bf.readLine());
            for(int i=0;i<T;i++){
            str = bf.readLine().split(" ");

        if(str[0].equals("add")){
            trie.insert(str[1]);
        }else{
            System.out.println(trie.find(str[1]));
        }

    } 
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
   }

和失败的测试用例是

输入:

11
add s
add ss
add sss
add ssss
add sssss
find s
find ss
find sss
find ssss
find sssss
find ssssss

,输出应为

5
4
3
2
1
0

有人可以解释我哪里错了。任何帮助将不胜感激。谢谢 就我而言,输出是

4
3
2
1
0
0

0 个答案:

没有答案