前言:剑指offer刷题系列
问题:
给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例:
输入:s = "egg", t = "add"
输出:true
思路:
同构字符串的条件是s中的字符和t中的字符是一一对应的关系。即:
相同字符只能映射到同一个字符上:s中的字符到t中的字符的映射是唯一的;
不同字符不能映射到同一个字符上:t中的字符到s中的字符的映射是唯一的;
在我的代码方法中,首先创建了两个空字典s2t
和t2s
,用于存储字符之间的映射关系。
接下来,通过使用zip
函数将字符串s
和t
中的字符一一对应起来,并使用循环遍历这些对应的字符对。
在每次循环中,通过检查当前字符对(sc, tc)
是否满足以下条件来判断它们是否是同构的:
- 如果
sc
已经在字典s2t
中存在,并且其对应的值s2t[sc]
不等于字符tc
,则说明s
和t
不是同构的,返回False
。 - 如果
tc
已经在字典t2s
中存在,并且其对应的值t2s[tc]
不等于字符sc
,则说明s
和t
不是同构的,返回False
。
如果以上两个条件都不满足,说明当前的字符对是有效的映射关系,将其添加到相应的字典中:
s2t[sc] = tc
表示将字符sc
映射为字符tc
。t2s[tc] = sc
表示将字符tc
映射为字符sc
。
最后,如果循环结束后没有提前返回False
,则说明所有的字符对都满足同构的条件,返回True
。
基于上述思考,代码如下:
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
s2t = {}
t2s = {}
for sc, tc in zip(s, t):
if (sc in s2t and s2t[sc] != tc) or (tc in t2s and t2s[tc] != sc):
return False
s2t[sc] = tc
t2s[tc] = sc
return True
执行结果如下图:
学到的知识点:
什么是同构?同构是数学中的一个概念,它指的是两个结构在某种意义下具有相同的属性和操作。在数学中研究同构的主要目的是为了把数学理论应用于不同的领域。如果两个结构是同构的,那么其上的对象会有相似的属性和操作,对某个结构成立的命题在另一个结构上也成立。