题目描述:
设计一个使用单词列表进行初始化的数据结构,单词列表中的单词 互不相同 。 如果给出一个单词,请判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。
实现 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”); // 返回 FalsemagicDictionary.search(“hhllo”); // 将第二个 ‘h’ 替换为 ‘e’ 可以匹配 “hello” ,所以返回 TruemagicDictionary.search(“hell”); // 返回 FalsemagicDictionary.search(“leetcoded”); // 返回 False
题目解析
这个题目是个纸老虎,看着挺复杂,其实非常简单,个人感觉写成中等难度在于读题花时间。 题目其他都没有什么主要实现在于search这个函数,主要判断输入参数searchWord是否跟已有字典中的字符串只差一个。这么理解就可以直接写代码了。
首先初始化一个空列表dict_list用来保存魔法字典。buidDict把dict_list填充。search函数的实现主要包含以下几个步骤:
- 遍历dict_list中的每个word
- 判断searchWord的长度与每个word是否相同,相同则继续,不同直接跳过
- 判断searchWord与每个word的不同字符个数,超过1的直接跳过
代码自然而然如下:
class MagicDictionary:
def __init__(self):
#构建一个dict
self.dict_list=[]
def buildDict(self, dictionary: List[str]) -> None:
if dictionary:
self.dict_list=dictionary
def search(self, searchWord: str) -> bool:
#
n=len(searchWord)
#遍历dic_list
for sub_word in self.dict_list:
if len(sub_word)==n:
#长度必须相等不相等直接跳过
count=0
for chx,chy in zip(sub_word,searchWord):
#统计不同字符个数
if chx!=chy :
count+=1
#不同字符数超过1直接跳过
if count>1:
break
#最后不同字符等于1返回True其他返回False
if count==1:
return True
return False
计算复杂度
这里假设dic_list的长度为n,每个字符串的长度假定为l,个人感觉进度次数可以不考虑。时间复杂度为 O ( n l ) O(nl) O(nl),空间复杂度也为 O ( n l ) O(nl) O(nl)。