class Trie { Trie[] children = new Trie[26]; boolean isEnd; } class WordDictionary { private Trie trie; /** Initialize your data structure here. */ public WordDictionary() { trie = new Trie(); } public void addWord(String word) { Trie node = trie; for (char c : word.toCharArray()) { int idx = c - 'a'; if (node.children[idx] == null) { node.children[idx] = new Trie(); } node = node.children[idx]; } node.isEnd = true; } public boolean search(String word) { return search(word, trie); } private boolean search(String word, Trie node) { for (int i = 0; i < word.length(); ++i) { char c = word.charAt(i); int idx = c - 'a'; if (c != '.' && node.children[idx] == null) { return false; } if (c == '.') { for (Trie child : node.children) { if (child != null && search(word.substring(i + 1), child)) { return true; } } return false; } node = node.children[idx]; } return node.isEnd; } } /** * Your WordDictionary object will be instantiated and called as such: * WordDictionary obj = new WordDictionary(); * obj.addWord(word); * boolean param_2 = obj.search(word); */