676. Implement Magic Dictionary

Medium (Trung bình) Python 🔗 Xem trên LeetCode

📋 Đề Bài

Design a data structure that is initialized with a list of different words. Provided a string, you should determine if you can change exactly one character in this string to match any word in the data structure.

Implement the MagicDictionary class:

  • MagicDictionary() Initializes the object.
  • void buildDict(String[] dictionary) Sets the data structure with an array of distinct strings dictionary.
  • bool search(String searchWord) Returns true if you can change exactly one character in searchWord to match any string in the data structure, otherwise returns false.

 

Example 1:

Input
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
[[], [["hello", "leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
Output
[null, null, false, true, false, false]

Explanation
MagicDictionary magicDictionary = new MagicDictionary();
magicDictionary.buildDict(["hello", "leetcode"]);
magicDictionary.search("hello"); // return False
magicDictionary.search("hhllo"); // We can change the second 'h' to 'e' to match "hello" so we return True
magicDictionary.search("hell"); // return False
magicDictionary.search("leetcoded"); // return False

 

Constraints:

  • 1 <= dictionary.length <= 100
  • 1 <= dictionary[i].length <= 100
  • dictionary[i] consists of only lower-case English letters.
  • All the strings in dictionary are distinct.
  • 1 <= searchWord.length <= 100
  • searchWord consists of only lower-case English letters.
  • buildDict will be called only once before search.
  • At most 100 calls will be made to search.

🧠 Thuật Toán & Kỹ Thuật

Hash Table (Bảng băm)Union Find (Tập hợp rời rạc)Trie (Cây tiền tố)
⏱️ Thời gian O(n²)
💾 Không gian O(n)

💻 Lời Giải

Python 0676-implement-magic-dictionary.py
class Node:
    def __init__(self):
        self.isLastWord = False
        self.children = defaultdict(Node)
        
class Trie:
    def __init__(self):
        self.root = Node()
        
    def insert(self, word: str) -> None:
        root = self.root
        for char in word:
            root = root.children[char]
        root.isLastWord = True
    
    def find(self, word: str) -> bool:
        root = self.root
        for char in word:
            if char not in root.children:
                return False
            root = root.children[char]
        return root.isLastWord

class MagicDictionary:

    def __init__(self):
        self.trie = Trie()

    def buildDict(self, dictionary: List[str]) -> None:
        for word in dictionary:
            self.trie.insert(word)

    def search(self, searchWord: List[str]) -> bool:
        n = len(searchWord)
        searchWord = list(searchWord)
        
        for i in range(n):
            for step in range(26):
                if step == ord(searchWord[i]) - ord('a'):
                    continue
                tmp = searchWord[i]
                searchWord[i] = chr(step + ord('a'))
                if self.trie.find(searchWord):
                    return True
                searchWord[i] = tmp
                
        return False


# Your MagicDictionary object will be instantiated and called as such:
# obj = MagicDictionary()
# obj.buildDict(dictionary)
# param_2 = obj.search(searchWord)