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 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.
Examples
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.
思路
我能想到的就是根据word_length建立map,来减少循环次数
但最后发现快速执行的代码就用了很普通的String[] dic,好吧是我多虑了
代码
class MagicDictionary {
Map<Integer, List<String>> dic;
public MagicDictionary() {
dic = new HashMap<>();
}
public void buildDict(String[] dictionary) {
for(String word: dictionary) {
List<String> tmp = dic.getOrDefault(word.length(), new ArrayList<>());
tmp.add(word);
dic.put(word.length(), tmp);
}
}
public boolean different(String a, String b) {
int count = 0;
for (int i = 0; i < a.length(); i++){
if (a.charAt(i) != b.charAt(i))
count ++;
}
return count == 1;
}
public boolean search(String searchWord) {
int length = searchWord.length();
if (!dic.containsKey(length))
return false;
for (String word: dic.get(length)) {
if (different(word, searchWord))
return true;
}
return false;
}
}
/**
* Your MagicDictionary object will be instantiated and called as such:
* MagicDictionary obj = new MagicDictionary();
* obj.buildDict(dictionary);
* boolean param_2 = obj.search(searchWord);
*/