§1
题目描述
实现 MagicDictionary 类: MagicDictionary() 初始化对象 void buildDict(String[] dictionary) 使用字符串数组 dictionary 设定该数据结构, dictionary 中的字符串互不相同 bool search(String searchWord) 给定一个字符串 searchWord ,判定能否只将字符串中 一个 字母换成另一个字母,使得所形成的新字符串能够与字典中的任一字符串匹配。如果可以,返回 true ;否则,返回 false 。
buildDict/search = ["hello","leetcode"], search("hhllo")
输出 = true
§2
思路解析动画文字版
下面 9 步动画会按主解代码推进,而不是泛泛讲题型。
1. 看输入:图/Trie 状态跟着代码走:先把示例输入映射到代码参数:def __init__(self):。
2. 初始化:图/Trie 状态跟着代码走:开局只立住必要变量:self.words = [];self.words = dictionary。
3. 进入主循环:图/Trie 状态跟着代码走:主流程从这里开始:for word in self.words:。
4. 判断分支:图/Trie 状态跟着代码走:题目条件落到这一行:if len(word) != len(searchWord):。
5. 更新状态:图/Trie 状态跟着代码走:对应代码:diff += 1。这一行决定当前轮对答案有什么贡献。
6. 处理边界:图/Trie 状态跟着代码走:边界跟着代码看:if diff > 1:。
7. 继续推进:图/Trie 状态跟着代码走:推进语句是:if diff == 1:。处理过的部分不再重新枚举。
8. 准备返回:图/Trie 状态跟着代码走:到这里,diff 已经能表达题目要求。
9. 答案收束:图/Trie 状态跟着代码走:最后检查返回形态:返回值、原地修改或设计类状态,要和 LeetCode 判题方式一致。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
§3
参考代码
class MagicDictionary: def __init__(self): self.words = [] def buildDict(self, dictionary): self.words = dictionary def search(self, searchWord): for word in self.words: if len(word) != len(searchWord): continue diff = 0 for a, b in zip(word, searchWord): if a != b: diff += 1 if diff > 1: break if diff == 1: return True return False看懂代码不等于写得出。盖住上面,自己默写一遍试试。卡在哪一行说不清,就点右下角问小欧。
§4
复杂度
- 时间复杂度:O(words * L),逐词比较
- 空间复杂度:O(words * L),保存字典
§5
易错点
✗ 错误写法:允许 0 处差异
✓ 正确写法:必须恰好 1 处差异
原词完全相同不算成功
✗ 错误写法:长度不同也比较
✓ 正确写法:长度必须相同
只能修改一个字符,不能增删
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。再去主线里挑下一道练手。
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
299道动画图解
37节语音讲解
28课数据结构
¥0.27折合 / 天
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
¥99 开通年卡 →
想成体系刷透这类套路?去图解算法专题