Python easy to follow solution using Trie.
\n\n    class TrieNode():\n        def __init__(self):\n            self.children = collections.defaultdict(TrieNode)\n            self.isWord = False\n        
    \n\n    class TrieNode():\n        def __init__(self):\n            self.children = collections.defaultdict(TrieNode)\n            self.isWord = False\n        \n    class WordDictionary(object):\n        def __init__(self):\n            self.root = TrieNode()\n\n        def addWord(self, word):\n            node = self.root\n            for w in word:\n                node = node.children[w]\n            node.isWord = True\n\n        def search(self, word):\n            node = self.root\n            self.res = False\n            self.dfs(node, word)\n            return self.res\n        \n        def dfs(self, node, word):\n            if not word:\n                if node.isWord:\n                    self.res = True\n                return \n            if word[0] == ".":\n                for n in node.children.values():\n                    self.dfs(n, word[1:])\n            else:\n                node = node.children.get(word[0])\n                if not node:\n                    return \n                self.dfs(node, word[1:])
['Backtracking', 'Depth-First Search', 'Python']