Description
Implement a magic directory with buildDict
, and search
methods.
For the method buildDict
, you'll be given a list of non-repetitive words to build a dictionary.
For the method search
, you'll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.
Example 1:
Input: buildDict(["hello", "leetcode"]), Output: Null
Input: search("hello"), Output: False
Input: search("hhllo"), Output: True
Input: search("hell"), Output: False
Input: search("leetcoded"), Output: False
Note:
- You may assume that all the inputs are consist of lowercase letters
a-z
. - For contest purpose, the test data is rather small by now. You could think about highly efficient algorithm after the contest.
- Please remember to RESET your class variables declared in class MagicDictionary, as static/class variables are persisted across multiple test cases. Please see here for more details.
Solution
Backtracking to Generalized Neighbors + HashSet, buildDict O(N), search O(L), S(N)
class MagicDictionary {
private Set<String> set;
/** Initialize your data structure here. */
public MagicDictionary() {
set = new HashSet<>();
}
/** Build a dictionary through a list of words */
public void buildDict(String[] dict) {
set.clear();
if (dict == null) {
return;
}
set.addAll(Arrays.asList(dict));
}
/** 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) {
if (word == null || word.isEmpty()) {
return false;
}
char[] arr = word.toCharArray();
// construct one edit distance words
for (int i = 0; i < arr.length; ++i) {
char c = arr[i];
for (char j = 'a'; j <= 'z'; ++j) {
if (j == c) {
continue;
}
arr[i] = j;
if (set.contains(new String(arr))) {
return true;
}
}
arr[i] = c;
}
return false;
}
}
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary obj = new MagicDictionary();
* obj.buildDict(dict);
* boolean param_2 = obj.search(word);
*/