Implementar un intentar con los métodos insert, search y startsWith.
Solución Java 1
Un nodo trie debe contener el personaje, sus hijos y la bandera que marca si es un nodo hoja. Puede utilizar el trie en el siguiente diagrama para recorrer la solución de Java.
class TrieNode { char c; 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; public Trie() { root = new TrieNode(); } // Inserts a word into the trie. public void insert(String word) { HashMap<Character, TrieNode> children = root.children; 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); children.put(c, t); } children = t.children; //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; } } return t; } } |
Solución Java 2: mejore el rendimiento mediante el uso de una matriz
Cada nodo trie solo puede contener caracteres ‘a’ – ‘z’. Entonces podemos usar una pequeña matriz para almacenar el carácter.
class TrieNode { TrieNode[] arr; boolean isEnd; // Initialize your data structure here. public TrieNode() { this.arr = new TrieNode[26]; } } public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } // Inserts a word into the trie. public void insert(String word) { TrieNode p = root; for(int i=0; i<word.length(); i++){ char c = word.charAt(i); int index = c-'a'; if(p.arr[index]==null){ TrieNode temp = new TrieNode(); p.arr[index]=temp; p = temp; }else{ p=p.arr[index]; } } p.isEnd=true; } // Returns if the word is in the trie. public boolean search(String word) { TrieNode p = searchNode(word); if(p==null){ return false; }else{ if(p.isEnd) return true; } return false; } // Returns if there is any word in the trie // that starts with the given prefix. public boolean startsWith(String prefix) { TrieNode p = searchNode(prefix); if(p==null){ return false; }else{ return true; } } public TrieNode searchNode(String s){ TrieNode p = root; for(int i=0; i<s.length(); i++){ char c= s.charAt(i); int index = c-'a'; if(p.arr[index]!=null){ p = p.arr[index]; }else{ return null; } } if(p==root) return null; return p; } } |
Si las mismas palabras se pueden insertar más de una vez, ¿qué necesita cambiar para que funcione?