1. 程式人生 > >Implement Magic Dictionary 實現一個魔法字典

Implement Magic Dictionary 實現一個魔法字典

實現一個帶有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

注意:

  1. 你可以假設所有輸入都是小寫字母 a-z
  2. 為了便於競賽,測試所用的資料量很小。你可以在競賽結束後,考慮更高效的演算法。
  3. 請記住重置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);
 */