676. Implement magic dictionary
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.
解法1
#include<string> #include<vector> #include<iostream> #include<unordered_map> using namespace std; class MagicDictionary{ unordered_map<int,vector<string>> m; public: MagicDictionary(){ } void buildDict(vector<string> dict){ for(string word: dict){ m[word.size()].push_back(word); } } bool search(string word){ for(string str: m[word.size()]){ int cnt=0,i=0; for(;i<word.size();++i){ if(word[i]==str[i]) continue; //if(word[i]!=str[i] && cnt==1) break; cnt++; } if(i==word.size()&&cnt==1) return true; } return false; } }; int main(){ MagicDictionary magicDictionary; magicDictionary.buildDict({"hello","leetcode"}); cout<<magicDictionary.search("hello")<<endl; cout<<magicDictionary.search("hhllo")<<endl; cout<<magicDictionary.search("hell")<<endl; cout<<magicDictionary.search("leetcoded")<<endl; return 0; }
解法2
#include<string> #include<vector> #include<iostream> #include<unordered_map> #include<unordered_set> using namespace std; class MagicDictionary{ unordered_set<string> st; public: MagicDictionary(){ } void buildDict(vector<string> dict){ for(string word: dict){ st.insert(word); } } bool search(string word){ for(int i=0;i<word.size();++i){ char tmp=word[i]; for(char c='a';c<='z';++c){ if(c==tmp) continue; word[i]=c; if(st.find(word)!=st.end()){ return true; } } word[i]=tmp; } return false; } }; int main(){ MagicDictionary magicDictionary; magicDictionary.buildDict({"hello","leetcode"}); cout<<magicDictionary.search("hello")<<endl; cout<<magicDictionary.search("hhllo")<<endl; cout<<magicDictionary.search("hell")<<endl; cout<<magicDictionary.search("leetcoded")<<endl; return 0; }
参考