Easy to understand  Java solution using Trie and Recursion with explanation
public class WordDictionary {\n        private class TrieNode {\n            private boolean isWord;\n            private HashMap<Character, TrieNode> childList
    public class WordDictionary {\n        private class TrieNode {\n            private boolean isWord;\n            private HashMap<Character, TrieNode> childList;\n            \n            public TrieNode() {\n                isWord = false;\n                childList = new HashMap<Character, TrieNode>();\n            }\n        }\n        \n        private TrieNode root = new TrieNode();\n    \n        // Adds a word into the data structure.\n        public void addWord(String word) {\n            TrieNode curr = root;\n            for (int i = 0; i < word.length(); i++) {\n                if (!curr.childList.containsKey(word.charAt(i))) {\n                    curr.childList.put(word.charAt(i), new TrieNode());\n                }\n                curr = curr.childList.get(word.charAt(i));\n            }\n            curr.isWord = true;\n        }\n    \n        // Returns if the word is in the data structure. A word could\n        // contain the dot character '.' to represent any one letter.\n        public boolean search(String word) {\n            return searchHelper(root, 0, word);\n        }\n        \n        private boolean searchHelper(TrieNode node, int pos, String word) {\n            //if the word has all been scanned, return\n            if (pos == word.length()) {\n                return node.isWord;\n            }\n            //reach the leaf before finishing scanning the word\n            if (node.childList.size() == 0) {\n                return false;\n            }\n            \n            //if the character at current position is '.', \n            //recursive check whether the remaing word is in the trie\n            if (word.charAt(pos) == '.') {\n                for (Character c : node.childList.keySet()) {\n                    if (searchHelper(node.childList.get(c), pos + 1, word)) {\n                        return true;\n                    }\n                }\n            }\n            \n            //if character at position 'pos' is neither equal to the node nor '.', return false\n            if (!node.childList.containsKey(word.charAt(pos))) {\n                return false;\n            }\n            \n            //if character at current position matches the node, \n            //recursively search the remaining word\n            return searchHelper(node.childList.get(word.charAt(pos)), pos + 1, word);\n        }\n    }
['Java']