如何实现判断两个字符串是否为同构的Python算法?
判断同构字符串的完整实现与逻辑拆解
首先明确同构字符串的核心规则:
- 同一字符的所有出现必须替换为同一个目标字符,顺序保持不变
- 不同字符不能映射到同一个目标字符(避免一对多的反向映射)
- 字符可以映射到自身
完整可运行代码
def isIsomorphic(self, s, t): # 快速失败:长度不等直接排除 if len(s) != len(t): return False # 双向映射字典,同时约束s→t和t→s的唯一性 s_to_t = {} t_to_s = {} for sc, tc in zip(s, t): # 检查s字符的已有映射是否和当前t字符冲突 if sc in s_to_t and s_to_t[sc] != tc: return False # 检查t字符是否已经被其他s字符映射(避免不同s字符映射到同一t字符) if tc in t_to_s and t_to_s[tc] != sc: return False # 建立/更新双向映射 s_to_t[sc] = tc t_to_s[tc] = sc # 所有字符校验通过 return True
关键逻辑说明
很多人一开始会只做s→t的单向映射,但这会漏掉不同s字符映射到同一t字符的错误情况(比如s="ab", t="aa")。所以必须用两个字典做双向约束:
- 第一个字典
s_to_t确保s中的每个字符只会映射到同一个t字符 - 第二个字典
t_to_s确保t中的每个字符只会被同一个s字符映射
遍历过程中只要发现任何一对字符违反映射规则,就立刻返回False;遍历完成后说明所有映射都符合要求,返回True。
常见测试用例验证
- 合法案例:
s="egg", t="add"→ 返回True(e→a,g→d) - 非法案例1:
s="foo", t="bar"→ 返回False(o需要同时映射到a和r) - 非法案例2:
s="ab", t="aa"→ 返回False(a和b都试图映射到a) - 边界案例:
s="", t=""→ 返回True;s="a", t="a"→ 返回True
内容的提问来源于stack exchange,提问作者C. Wei
相关产品推荐
相关产品推荐

