[Python3] Solution with using trie
\nclass MagicDictionary:\n    def __init__(self):\n        self.trie = {}\n        self.end = \'end\'\n\n    def buildDict(self, dictionary: List[str]) -> None:
```\nclass MagicDictionary:\n    def __init__(self):\n        self.trie = {}\n        self.end = \'end\'\n\n    def buildDict(self, dictionary: List[str]) -> None:\n        for word in dictionary:\n            node = self.trie\n            for c in word:\n                if c not in node:\n                    node[c] = {}\n                \n                node = node[c]\n            \n            node[self.end] = True\n    \n    def _search_after_change(self, suffix, node):\n        for c in suffix:\n            if c not in node:\n                return False\n            \n            node = node[c]\n        \n        if self.end not in node:\n            return False\n        \n        return True\n    \n    def search(self, searchWord: str) -> bool:\n        node = self.trie\n        \n        for idx in range(len(searchWord)):\n            for key in node:\n                if key != self.end and key != searchWord[idx]:\n                    suffix = searchWord[idx + 1:]\n                    if self._search_after_change(suffix, node[key]):\n                        return True\n            \n            # changing one character didn\'t give us anything\n            if searchWord[idx] not in node:\n                return False\n            \n            node = node[searchWord[idx]]\n        \n        return False\n```
['Array', 'Trie', 'Python3']