Getting a list of words from a Trie

后端 未结 10 854
野性不改
野性不改 2021-01-02 15:29

I\'m looking to use the following code to not check whether there is a word matching in the Trie but to return a list all words beginning with the prefix inputted by the use

相关标签:
10条回答
  • 2021-01-02 15:56

    The simplest solution is to use a depth-first search.

    You go down the trie, matching letter by letter from the input. Then, once you have no more letter to match, everything under that node are strings that you want. Recursively explore that whole subtrie, building the string as you go down to its nodes.

    0 讨论(0)
  • 2021-01-02 15:56

    You would need to use a List
    List<String> myList = new ArrayList<String>();
    if(matchingStringFound)
    myList.add(stringToAdd);

    0 讨论(0)
  • 2021-01-02 15:56

    Here is an implementation in C++

    https://github.com/dchavezlive/Basic-Trie

    In your search function, you can have it return the node of where the prefix ends. If you make sure your node then has a field to save every child (vector?), then you can list all the children from that node where your prefix ends.

    0 讨论(0)
  • 2021-01-02 15:59

    I faced this problem while trying to make a text auto-complete module. I solved the problem by making a Trie in which each node contains it's parent node as well as children. First I searched for the node starting at the input prefix. Then I applied a Traversal on the Trie that explores all the nodes of the sub-tree with it's root as the prefix node. whenever a leaf node is encountered, it means that the end of a word starting from input prefix has been found. Starting from that leaf node I iterate through the parent nodes getting parent of parent, and reach the root of the subtree. While doing so I kept adding the keys of nodes in a stack. In the end I took the prefix and started appended it by popping the stack. I kept on saving the words in an ArrayList. At the end of the traversal I get all the words starting from the input prefix. Here is the code with usage example:

    class TrieNode
    {
        char c;
        TrieNode parent;
        HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();
        boolean isLeaf;
    
        public TrieNode() {}
        public TrieNode(char c){this.c = c;}
    }
    

    -

    public class Trie
    {
        private TrieNode root;
        ArrayList<String> words; 
        TrieNode prefixRoot;
        String curPrefix;
    
        public Trie()
        {
            root = new TrieNode();
            words  = new ArrayList<String>();
        }
    
        // Inserts a word into the trie.
        public void insert(String word) 
        {
            HashMap<Character, TrieNode> children = root.children;
    
            TrieNode crntparent;
    
            crntparent = root;
    
            //cur children parent = root
    
            for(int i=0; i<word.length(); i++)
            {
                char c = word.charAt(i);
    
                TrieNode t;
                if(children.containsKey(c)){ t = children.get(c);}
                else
                {
                t = new TrieNode(c);
                t.parent = crntparent;
                children.put(c, t);
                }
    
                children = t.children;
                crntparent = t;
    
                //set leaf node
                if(i==word.length()-1)
                    t.isLeaf = true;    
            }
        }
    
        // Returns if the word is in the trie.
        public boolean search(String word)
        {
            TrieNode t = searchNode(word);
            if(t != null && t.isLeaf){return true;}
            else{return false;}
        }
    
        // Returns if there is any word in the trie
        // that starts with the given prefix.
        public boolean startsWith(String prefix) 
        {
            if(searchNode(prefix) == null) {return false;}
            else{return true;}
        }
    
        public TrieNode searchNode(String str)
        {
            Map<Character, TrieNode> children = root.children; 
            TrieNode t = null;
            for(int i=0; i<str.length(); i++)
            {
                char c = str.charAt(i);
                if(children.containsKey(c))
                {
                    t = children.get(c);
                    children = t.children;
                }
                else{return null;}
            }
    
            prefixRoot = t;
            curPrefix = str;
            words.clear();
            return t;
        }
    
    
        ///////////////////////////
    
    
      void wordsFinderTraversal(TrieNode node, int offset) 
      {
            //  print(node, offset);
    
            if(node.isLeaf==true)
            {
              //println("leaf node found");
    
              TrieNode altair;
              altair = node;
    
              Stack<String> hstack = new Stack<String>(); 
    
              while(altair != prefixRoot)
              {
                //println(altair.c);
                hstack.push( Character.toString(altair.c) );
                altair = altair.parent;
              }
    
              String wrd = curPrefix;
    
              while(hstack.empty()==false)
              {
                wrd = wrd + hstack.pop();
              }
    
              //println(wrd);
              words.add(wrd);
    
            }
    
             Set<Character> kset = node.children.keySet();
             //println(node.c); println(node.isLeaf);println(kset);
             Iterator itr = kset.iterator();
             ArrayList<Character> aloc = new ArrayList<Character>();
    
           while(itr.hasNext())
           {
            Character ch = (Character)itr.next();  
            aloc.add(ch);
            //println(ch);
           } 
    
         // here you can play with the order of the children
    
           for( int i=0;i<aloc.size();i++)
           {
            wordsFinderTraversal(node.children.get(aloc.get(i)), offset + 2);
           } 
    
      }
    
    
     void displayFoundWords()
     {
       println("_______________");
      for(int i=0;i<words.size();i++)
      {
        println(words.get(i));
      } 
      println("________________");
    
     }
    
    
    
    }//
    

    Example

    Trie prefixTree;
    
    prefixTree = new Trie();  
    
      prefixTree.insert("GOING");
      prefixTree.insert("GONG");
      prefixTree.insert("PAKISTAN");
      prefixTree.insert("SHANGHAI");
      prefixTree.insert("GONDAL");
      prefixTree.insert("GODAY");
      prefixTree.insert("GODZILLA");
    
      if( prefixTree.startsWith("GO")==true)
      {
        TrieNode tn = prefixTree.searchNode("GO");
        prefixTree.wordsFinderTraversal(tn,0);
        prefixTree.displayFoundWords(); 
    
      }
    
      if( prefixTree.startsWith("GOD")==true)
      {
        TrieNode tn = prefixTree.searchNode("GOD");
        prefixTree.wordsFinderTraversal(tn,0);
        prefixTree.displayFoundWords(); 
    
      }
    
    0 讨论(0)
提交回复
热议问题