All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0601_0700.s0676_implement_magic_dictionary.MagicDictionary Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0601_0700.s0676_implement_magic_dictionary;

// #Medium #String #Hash_Table #Design #Trie #2022_03_22_Time_38_ms_(86.83%)_Space_52.7_MB_(76.19%)

/**
 * 676 - Implement Magic Dictionary\.
 *
 * Medium
 *
 * 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`.
**/
public class MagicDictionary {
    private String[] dictionaryWords;

    public MagicDictionary() {
        dictionaryWords = null;
    }

    public void buildDict(String[] dictionary) {
        dictionaryWords = dictionary;
    }

    public boolean search(String searchWord) {
        for (String word : dictionaryWords) {
            if (isOffByOneLetter(word, searchWord)) {
                return true;
            }
        }
        return false;
    }

    private boolean isOffByOneLetter(String word, String searchWord) {
        if (isDifferentLengths(word, searchWord) || word.equals(searchWord)) {
            return false;
        }
        int numDifferentLetters = 0;
        for (int i = 0; i < word.length(); i++) {
            if (isNotTheSameLetter(word.charAt(i), searchWord.charAt(i))) {
                numDifferentLetters++;
            }
            if (numDifferentLetters > 1) {
                return false;
            }
        }
        return numDifferentLetters == 1;
    }

    private boolean isDifferentLengths(String word, String searchWord) {
        return word.length() != searchWord.length();
    }

    private boolean isNotTheSameLetter(char c1, char c2) {
        return c1 != c2;
    }
}

/*
 * Your MagicDictionary object will be instantiated and called as such:
 * MagicDictionary obj = new MagicDictionary();
 * obj.buildDict(dictionary);
 * boolean param_2 = obj.search(searchWord);
 */




© 2015 - 2025 Weber Informatics LLC | Privacy Policy