今日打卡题目:676. 实现一个魔法字典
题目描述
设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。 实现 MagicDictionary 类: MagicDictionary() 初始化对象 void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构,dictionary 中的字符串互不相同 bool search(String searchWord) 给定一个字符串 searchWord ,判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。
解答思路
- 需要存一个单词表,因为单词表里的单词不同,所以用 Map 存储;
- 只有一个单词能被替换时才返回true,因此可以先判断比较单词长度与查询单词的长度,不一致则直接跳出循环;
- 满足条件 2 后,开始逐步匹配,用变量计数,当不同字母数大于 1 时跳出循环。
答题时出现的问题
- 获取字典表时用 map.keys(),返回的是对象形式,需要转为数组进行操作;
- 比较长度时用了 break 打断,导致后面循环无法继续,应该使用 continue;
- 比较单词差异的时候没有用二元数组,获取的是单词,不是单词的字母。
代码
var MagicDictionary = function() {
this.map = new Map()
};
/**
* @param {string[]} dictionary
* @return {void}
*/
MagicDictionary.prototype.buildDict = function(dictionary) {
// 因为数据结构不一样,所以用map存储
dictionary.map((item,index) => {
if(!this.map.has(item)) {
this.map.set(item,index)
}
})
};
/**
* @param {string} searchWord
* @return {boolean}
*/
MagicDictionary.prototype.search = function(searchWord) {
// 提取字典库
let dictionaryList = Array.from(this.map.keys())
for(let i=0; i<dictionaryList.length; i++) {
// 长度不一样,不满足条件直接pass
if(searchWord.length !== dictionaryList[i].length) continue
let diff = 0
// 遍历比较
for(j = 0;j<searchWord.length;j++) {
if(searchWord[j] !== dictionaryList[i][j]) diff++
if(diff > 1) break
}
if(diff===1) return true
}
return false
};