leetCode676:实现一个魔法字典,字典树迷惑题

目录

一、题目描述

二、解题思路

三、代码实现


一、题目描述

设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。

实现 MagicDictionary 类:

  • MagicDictionary() 初始化对象
  • void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同
  • bool search(String searchWord) 给定一个字符串 searchWord ,判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。
     

示例:

输入
["MagicDictionary", "buildDict", "search", "search", "search", "search"]
[[], [["hello", "leetcode"]], ["hello"], ["hhllo"], ["hell"], ["leetcoded"]]
输出
[null, null, false, true, false, false]

解释
MagicDictionary magicDictionary = new MagicDictionary();
magicDictionary.buildDict(["hello", "leetcode"]);
magicDictionary.search("hello"); // 返回 False
magicDictionary.search("hhllo"); // 将第二个 'h' 替换为 'e' 可以匹配 "hello" ,所以返回 True
magicDictionary.search("hell"); // 返回 False
magicDictionary.search("leetcoded"); // 返回 False
 

提示

  • 1 <= dictionary.length <= 100
  • 1 <= dictionary[i].length <= 100
  • dictionary[i] 仅由小写英文字母组成
  • dictionary 中的所有字符串 互不相同
  • 1 <= searchWord.length <= 100
  • searchWord 仅由小写英文字母组成
  • buildDict 仅在 search 之前调用一次
  • 最多调用 100 次 search

二、解题思路

首先说一下,这道题我个人觉得可以不用字典树来实现,并没有说我的这种解法有多好,仅提供一种思路。

我的解法是直接使用set或者哈希set。

插入操作直接使用set的insert操作;

search操作里面使用set里的每个元素与被搜索词比较:

  • 如果单词的长度不同或者两个单词相等直接跳过;
  • 如果长度相同且不等,遍历单词查看两个词是否只相差一个字符,如果是的话返回true,否则返回false。

三、代码实现

#include<bits/stdc++.h>
using namespace std;

class MagicDictionary {
public:
	unordered_set<string> strSet;
	/** Initialize your data structure here. */
	MagicDictionary() {

	}

	void buildDict(vector<string> dictionary) {
		int n = dictionary.size();
		for (int i = 0; i < n; i++) {
			strSet.insert(dictionary[i]);
		}
	}
	这里用Word改变去匹配set,这样更慢
	//bool search(string searchWord) {
	//	int n = searchWord.size();
	//	for (int i = 0; i < n; i++) {
	//		char tmp = searchWord[i];
	//		for (int j = 0; j < 26; j++) {
	//			char ch = 'a' + j;
	//			if (tmp == ch) continue;
	//			searchWord[i] = ch;
	//			if (strSet.count(searchWord)) {
	//				return true;
	//			}
	//		}
	//		searchWord[i] = tmp;
	//	}
	//	return false;
	//}
	//这里用set里的每个词去匹配Word,可以提高速度
	bool search(string searchWord) {
		for (auto& str : strSet) {
			if (str.size() != searchWord.size() || str == searchWord) {
				continue;
			} else {
				if (is_valid(str, searchWord)) {
					return true;
				}
			}
		}
		return false;
	}
	bool is_valid(string str1, string str2) {
		int n = str1.size();
		int cnt = 0;
		for (int i = 0; i < n; i++) {
			if (str1[i] != str2[i]) {
				cnt++;
			}
		}
		return cnt == 1 ? true : false;
	}
};

/**
 * Your MagicDictionary object will be instantiated and called as such:
 * MagicDictionary* obj = new MagicDictionary();
 * obj->buildDict(dictionary);
 * bool param_2 = obj->search(searchWord);
 */
int main() {
	MagicDictionary* obj = new MagicDictionary();
	obj->buildDict({ "hello", "leetcode" });
	int n;
	cin >> n;
	string searchWord;
	while (n--) {
		cin >> searchWord;
		cout << (obj->search(searchWord) ? "true" : "false");
		cout << endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值