Implement Magic Dictionary 實現一個魔法字典
阿新 • • 發佈:2018-12-13
實現一個帶有buildDict
, 以及 search
方法的魔法字典。
對於buildDict
方法,你將被給定一串不重複的單詞來構建一個字典。
對於search
方法,你將被給定一個單詞,並且判定能否只將這個單詞中一個字母換成另一個字母,使得所形成的新單詞存在於你構建的字典中。
示例 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
注意:
- 你可以假設所有輸入都是小寫字母
a-z
。 - 為了便於競賽,測試所用的資料量很小。你可以在競賽結束後,考慮更高效的演算法。
- 請記住重置MagicDictionary類中宣告的類變數,因為靜態/類變數會在多個測試用例中保留。 請參閱這裡瞭解更多詳情。
思路:這道題的標籤是Trie,就是要構建字典字首樹,但是自己編寫了很久也沒有debug正確,最終放棄了。發現如果用hashset可以非常簡單的編寫出來。
具體思路為把所有的string放入hashset中,然後每次改變一個string中的一個字元(會改變26次,對應a-z,如果改變的是自己本身的字元,那麼不做處理),然後再hashset中搜索答案,如果存在就返回true,如果遍歷完所有string,對每個string都改變了26次字元都沒有在hashset中發現,那麼返回false。
參考程式碼:
class MagicDictionary { public: /** Initialize your data structure here. */ MagicDictionary() { } /** Build a dictionary through a list of words */ void buildDict(vector<string> dict) { for (auto &s : dict) s_set.insert(s); } /** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */ bool search(string word) { for (int i = 0; i < word.size();i++) { char letter = word[i]; for (int j = 0; j < 26; j++) { word[i] = 'a' + j; if (letter != word[i]) { if (s_set.find(word) != s_set.end()) return true; } } word[i] = letter; } return false; } private: unordered_set<string> s_set; }; /** * Your MagicDictionary object will be instantiated and called as such: * MagicDictionary obj = new MagicDictionary(); * obj.buildDict(dict); * bool param_2 = obj.search(word); */