0676. Implement Magic Dictionary
https://leetcode.com/problems/implement-magic-dictionary
Description
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 stringsdictionary.bool search(String searchWord)Returnstrueif you can change exactly one character insearchWordto match any string in the data structure, otherwise returnsfalse.
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 FalseConstraints:
1 <= dictionary.length <= 1001 <= dictionary[i].length <= 100dictionary[i]consists of only lower-case English letters.All the strings in
dictionaryare distinct.1 <= searchWord.length <= 100searchWordconsists of only lower-case English letters.buildDictwill be called only once beforesearch.At most
100calls will be made tosearch.
ac
class MagicDictionary {
TrieNode root;
/** Initialize your data structure here. */
public MagicDictionary() {
root = new TrieNode();
}
/** Build a dictionary through a list of words */
public void buildDict(String[] dict) {
for (String word : dict) {
build(word);
}
}
private void build(String word) {
TrieNode r = root;
for (int i = 0; i < word.length(); i++) {
int pos = word.charAt(i) - 'a';
if (r.next[pos] == null) r.next[pos] = new TrieNode();
r = r.next[pos];
}
r.isWord = true;
}
/** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */
public boolean search(String word) {
return search2(root, word, 0, false);
}
private boolean search2(TrieNode node, String word, int start, boolean modified) {
TrieNode r = node;
for (int i = start; i < word.length(); i++) {
int p = word.charAt(i) - 'a';
if (!modified) {
// try to modify one char
for (int j = 0; j < 26; j++) {
if (j == p || r.next[j] == null) continue; // skip same character and null
if (search2(r.next[j], word, i+1, true)) return true;
}
}
// can't find it in this position, move on
if (r.next[p] == null) return false;
r = r.next[p];
}
return r.isWord && modified;
}
}
class TrieNode {
TrieNode[] next;
boolean isWord;
public TrieNode() {
next = new TrieNode[26];
}
}
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary obj = new MagicDictionary();
* obj.buildDict(dict);
* boolean param_2 = obj.search(word);
*/Last updated
Was this helpful?