You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现判断两个字符串是否为同构的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")。所以必须用两个字典做双向约束:

  1. 第一个字典s_to_t确保s中的每个字符只会映射到同一个t字符
  2. 第二个字典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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:13:27