目录

0205:同构字符串

力扣第 205 题

题目

给定两个字符串 st ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"
输出:true

示例 2:

输入:s = "foo", t = "bar"
输出:false

示例 3:

输入:s = "paper", t = "title"
输出:true

提示:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • st 由任意有效的 ASCII 字符组成

相似问题:

分析

#1

可以用哈希表判断是否单射,正反两次即可判断是否双射。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        def check(s,t):
            d = {}
            for a,b in zip(s,t):
                if a in d and d[a]!=b:
                    return False
                d[a] = b
            return True
        return check(s,t) and check(t,s)

45 ms

#2

还有个更巧妙的方法:

  • 若 len(set(s))==len(set(zip(s,t))),代表 s 到 t 是单射
  • 若 len(set(t))==len(set(zip(s,t))),代表 t 到 s 是单射
  • 同时满足即说明是双射

解答

1
2
3
class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        return len(set(zip(s,t)))==len(set(s))==len(set(t))

41 ms