【python3】leetcode 676. 实现一个魔法字典

题目描述:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值