题目描述
思路解析动画文字版
核心是一张 s→t 的映射表,再加一条铁律:映射必须双向一对一——同一个 s 字符只能对一个 t 字符,同一个 t 字符也只能被一个 s 字符占用。
开始前:s→t 的映射表是空的。下面把 s 的字符放在格子里,t 的对应字符列在下方,一位一位地对齐检查。
看第 0 位:s 这一格是 'c'(橙色),它在 t 里对应的字符是 'z'。下一步去映射表里查 'c' 之前记成了什么。
'c' 之前没出现过,就把它记进映射表:'c' → 'z'(绿色新增)。同时占用 t 字符 'z',以后别的字母不能再映到它。
到这里前 1 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
看第 1 位:s 这一格是 'b'(橙色),它在 t 里对应的字符是 'y'。下一步去映射表里查 'b' 之前记成了什么。
'b' 之前没出现过,就把它记进映射表:'b' → 'y'(绿色新增)。同时占用 t 字符 'y',以后别的字母不能再映到它。
到这里前 2 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
看第 2 位:s 这一格是 'a'(橙色),它在 t 里对应的字符是 'x'。下一步去映射表里查 'a' 之前记成了什么。
'a' 之前没出现过,就把它记进映射表:'a' → 'x'(绿色新增)。同时占用 t 字符 'x',以后别的字母不能再映到它。
到这里前 3 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
看第 3 位:s 这一格是 'a'(橙色),它在 t 里对应的字符是 'x'。下一步去映射表里查 'a' 之前记成了什么。
'a' 之前记过,映到 'x';这次它对的还是 'x',前后一致(命中高亮),通过,继续下一位。
到这里前 4 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
看第 4 位:s 这一格是 'b'(橙色),它在 t 里对应的字符是 'y'。下一步去映射表里查 'b' 之前记成了什么。
'b' 之前记过,映到 'y';这次它对的还是 'y',前后一致(命中高亮),通过,继续下一位。
到这里前 5 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
看第 5 位:s 这一格是 'c'(橙色),它在 t 里对应的字符是 'z'。下一步去映射表里查 'c' 之前记成了什么。
'c' 之前记过,映到 'z';这次它对的还是 'z',前后一致(命中高亮),通过,继续下一位。
到这里前 6 位都对得上,映射表里每个 s 字符对一个 t 字符、每个 t 字符也只被一个 s 字符占用,没有冲突。继续。
整串对齐完毕:c↔z、b↔y、a↔x 从头到尾都一致,也没有两个字母撞到同一个目标。s 和 t 同构,返回 true。
三个高频追问:为何要两张表(双射)、不用哈希的替代写法、以及和异位词的区别。
参考代码
def isIsomorphic(s, t): st, ts = {}, {} # s→t 和 t→s 两张映射表 for a, b in zip(s, t): if a in st and st[a] != b: # s 字符映出两种结果 return False if b in ts and ts[b] != a: # 两个 s 字符撞同一个 t 字符 return False st[a], ts[b] = b, a # 记下双向映射 return True复杂度
- 时间:O(n),把两个串同步扫一遍,每位做常数次哈希查询,n 是串长
- 空间:O(1),两张映射表最多各装下字符集大小(如 26 或 128)个键,与 n 无关
易错点
面试追问把动画讲成自己的话
追问为什么要维护两张映射表,一张不够吗?
追问有没有不用哈希表的写法?
追问同构和字母异位词有什么区别?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
存在重复元素
LeetCode 217 · 简单 · 沿着 哈希套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题