-
-
Save prettymuchbryce/3719435 to your computer and use it in GitHub Desktop.
| //Dictionary implemented using a Trie Tree. | |
| public class Dictionary { | |
| private HashMap<Character,Node> roots = new HashMap<Character,Node>(); | |
| /** | |
| * Search through the dictionary for a word. | |
| * @param string The word to search for. | |
| * @return Whether or not the word exists in the dictionary. | |
| */ | |
| public boolean search(String string) { | |
| if (roots.containsKey(string.charAt(0))) { | |
| if (string.length()==1 && roots.get(string.charAt(0)).endOfWord) { | |
| return true; | |
| } | |
| return searchFor(string.substring(1),roots.get(string.charAt(0))); | |
| } else { | |
| return false; | |
| } | |
| } | |
| /** | |
| * Insert a word into the dictionary. | |
| * @param string The word to insert. | |
| */ | |
| public void insert(String string) { | |
| if (!roots.containsKey(string.charAt(0))) { | |
| roots.put(string.charAt(0), new Node()); | |
| } | |
| insertWord(string.substring(1),roots.get(string.charAt(0))); | |
| } | |
| //Recursive method that inserts a new word into the trie tree. | |
| private void insertWord(String string, Node node) { | |
| final Node nextChild; | |
| if (node.children.containsKey(string.charAt(0))) { | |
| nextChild = node.children.get(string.charAt(0)); | |
| } else { | |
| nextChild = new Node(); | |
| node.children.put(string.charAt(0), nextChild); | |
| } | |
| if (string.length() == 1) { | |
| nextChild.endOfWord = true; | |
| return; | |
| } else { | |
| insertWord(string.substring(1),nextChild); | |
| } | |
| } | |
| //Recursive method that searches through the Trie Tree to find the value. | |
| private boolean searchFor(String string, Node node) { | |
| if (string.length()==0) { | |
| if (node.endOfWord) { | |
| return true; | |
| } else { | |
| return false; | |
| } | |
| } | |
| if (node.children.containsKey(string.charAt(0))) { | |
| return searchFor(string.substring(1),node.children.get(string.charAt(0))); | |
| } else { | |
| return false; | |
| } | |
| } | |
| } |
| public class Node { | |
| public Node parent; | |
| public Boolean endOfWord = false; //Does this Node mark the end of a particular word? | |
| public HashMap<Character,Node> children = new HashMap<Character,Node>(); | |
| } |
-Node should be private inner-class so as not to expose internal data, or at least have private fields with package exposure
-Should remove useless last if-else branches since there isn't any code afterwards and just return false at the end of methods
-Use Boolean Zen when returning true/false based on node.endOfWord, i.e. just return node.endOfWord
@mithuns my guess is the parent field of nodes is there for future reverse searches of words.
Whats the time complexity of this?
this code is genius. love it! - I'd like to use parts of your logic in an application that I'm making, would that be okay with you?
I prefer TreeMap to store word than HashMap, it automatically sorts all the character
Here's a kotlin implementation spun off of this one: https://gist.github.com/bseib/2c2d2d4745c47353a884a51af0cc4a7d
What is the purpose of parent variable ?