剑指 Offer II 064. 神奇的字典

这篇博客介绍了如何利用Python实现LeetCode中的两个算法:一是基于汉明距离的暴力搜索,二是通过定义广义邻居进行搜索。在暴力搜索中,通过比较字符是否相同来计算汉明距离,只考虑长度相等的单词。在广义邻居的搜索策略中,定义了一个单词的所有可能替换字符的广义邻居,并存储在集合中,查询时检查广义邻居的出现次数以确定是否存在目标单词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

力扣

思路一 暴力

如果一个字符中只有一个字符可以更改,那么它们的汉明距离为1.在搜索新单词时,只检查长度相同的单词。

代码一

class MagicDictionary:

    def __init__(self):
        self.buckets = collections.defaultdict(list)

    def buildDict(self, dictionary: List[str]) -> None:
        for word in dictionary:
            self.buckets[len(word)].append(word);

    def search(self, searchWord: str) -> bool:
        return any(sum(a != b for a, b in zip(candidate, searchWord)) == 1 for candidate in self.buckets[len(searchWord)])

思路二 广义邻居

定义广义邻居为单词中每一个字符被特殊符号替换,那个一个单词word有len(word)个广义邻居。将字典以集合形式保存下来,保存词典中每个单词的每个广义邻居,以字典形式保存,键为广义邻居,值为该广义邻居出现的次数。查询时,判断该广义邻居出现次数。如果次数大于1,那么肯定返回true。如果次数等于1,还要判断查找的单词不在字典中,才能返回true。

代码二

class MagicDictionary:
    def _genneighbors(self, word):
        for i in range(len(word)):
            yield word[:i] + '#' + word[i + 1:]

    def buildDict(self, dictionary: List[str]) -> None:
        self.words = set(dictionary)
        self.count = collections.Counter(nei for word in dictionary for nei in self._genneighbors(word))

    def search(self, searchWord: str) -> bool:
        return any(self.count[nei] > 1 or
                   self.count[nei] == 1 and searchWord not in self.words
                   for nei in self._genneighbors(searchWord))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值