题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg", t = "add"
输出: true
示例 2:输入: s = "foo", t = "bar"
输出: false
示例 3:输入: s = "paper", t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
python 代码
方法一: hash 法
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
#hash 方法
if len(s) != len(t):
return False
if len(s) == None or len(s)<2:
return True
# 使用哈希映射记录每个字母的转换方法,键:s的字母,值:t的字母
smap = {}
for i in range (len(s)):
# 如果s[i]不在键中,但t[i]出现在字典的值中,说明出现了s=ab,t=aa这种情况
if s[i] not in smap and t[i] in smap.values():
return False
# 如果s[i]已在键中,且t[i]与键s[i]的值不对应,说明出现了s=aa,t=ab这种情况
if s[i] in smap and smap[s[i]] !=t[i]:
return False
# 仅有以上两种情况需要输出False,如果不满足以上两种情况,则添加键值对
smap[s[i]] = t[i]
# 循环走完说明s和t中每个字母都有唯一的对应关系,可以输出True
return True
方法二:zip法
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
#zip方法
#将s和t进行zip后在set出现不重复的元组的个数与set(s)及set(t)都相等则说明结构相同
return len(set(zip(s,t)))==len(set(s))==len(set(t))
方法三 :通过28/30
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
#通过28/30
sl = len(s)
tl = len(t)
if sl != tl:
return False
if sl ==1 and tl == 1:
return True
rs = '0'
rt = '0'
for i in range(1,sl):
if s[i] == s[i-1]:
rs = rs+rs[-1]
else:
rs =rs +str(int(rs[-1])+1)
if t[i] == t[i-1]:
rt = rt+rt[-1]
else:
rt =rt +str(int(rt[-1])+1)
return rs==rt