I like this one a lot! Also from the archives. This one is listed as easy, I would say it’s on the harder side of easy. The word “isomorphism” is a bit gnarly, but you can ignore that. I’d rather this be introduced as a Caesar cipher, but maybe that’s also confusing, or makes the possible answer too clear. But if the question is “are you comfortable talking about isomorphism”, well, that’s not a very good question. So I suppose I’d phrase this as a Caesar cipher.
The interesting challenge is, well, distinguish an isomorphism from a homomorphism. Vaguely, the idea of distinguishing this “uniqueness” (invertibility) property is nice. Maybe to enable something like dictionary encoding? I’m trying to brainstorm how to motivate this question and give it some application-justification. In any case…
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
# Easy cases
if len(s) != len(t):
return False
mapping = {}
mapped = set([])
for i in range(len(s)):
sc = s[i]
tc = t[i]
if sc in mapping:
if mapping[sc] != tc:
return False
elif tc in mapped:
# uniqueness condition
return False
else:
mapping[sc] = tc
mapped.add(tc)
return True