1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
public class {
private class TrieNode { Map<Character, TrieNode> children; boolean isEnd;
public TrieNode() { children = new HashMap<>(); isEnd = false; } }
private final static Logger logger = LoggerFactory.getLogger(Trie.class); private final TrieNode root;
public () { this.root = new TrieNode(); }
public void insert(String word) { if (word == null || word.length() == 0) return; TrieNode curr = root; for (char c : word.toCharArray()) { TrieNode child = curr.children.get(c); if (child == null) { child = new TrieNode(); curr.children.put(c, child); } curr = child; } curr.isEnd = true; }
public void insertRecursive(String word) { if (word == null || word.length() == 0) return; this.insertRecursive(this.root, word, 0); }
private void insertRecursive(TrieNode curr, String word, int idx) { if (idx == word.length()) { curr.isEnd = true; return; } char c = word.charAt(idx); TrieNode child = curr.children.get(c); if (child == null) { child = new TrieNode(); curr.children.put(c, child); } insertRecursive(child, word, idx + 1); }
public boolean search(String word) { if (word == null || word.length() == 0) return false; TrieNode curr = root; for (char c : word.toCharArray()) { TrieNode child = curr.children.get(c); if (child == null) return false; curr = child; } return curr.isEnd; }
public boolean searchRecursive(String word) { if (word == null || word.length() == 0) return false; return searchRecursive(this.root, word, 0); }
private boolean searchRecursive(TrieNode curr, String word, int idx) { if (idx == word.length()) { return curr.isEnd; } char c = word.charAt(idx); TrieNode child = curr.children.get(c); if (child == null) return false; return searchRecursive(child, word, idx + 1); }
public boolean startWith(String word) { if (word == null) return false; TrieNode curr = root; for (char c : word.toCharArray()) { TrieNode child = curr.children.get(c); if (child == null) return false; curr = child; } return true; }
public boolean startWithRecursive(String word) { if (word == null) return false; return startWithRecursive(root, word, 0); }
private boolean startWithRecursive(TrieNode curr, String word, int idx) { if (idx == word.length()) return true; char c = word.charAt(idx); TrieNode child = curr.children.get(c); if (child == null) return false; return startWithRecursive(child, word, idx + 1); }
public void delete(String word) { if (word == null || word.length() == 0) return; delete(this.root, word, 0); }
private boolean delete(TrieNode curr, String word, int idx) { if (idx == word.length()) { if (!curr.isEnd) return false; curr.isEnd = false; return curr.children.size() == 0; } char c = word.charAt(idx); TrieNode child = curr.children.get(c); if (child == null) return false; boolean shouldDeleteChild = delete(child, word, idx + 1); if (shouldDeleteChild) { curr.children.remove(c); return curr.children.size() == 0; } return false; }
public static void test() { Trie trie = new Trie(); List<String> dict = Arrays.asList("abc", "abgl", "abcd", "cdef"); for (String word : dict) trie.insert(word); for (String word : dict) logger.info("Search for {}: {}", word, trie.search("abc")); for (String word : dict) { trie.delete(word); } } }
|
近期评论