给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg", t = "add"
输出: true
示例 2:
输入: s = "foo", t = "bar"
输出: false
示例 3:
输入: s = "paper", t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
str 类型数据拥有内置函数 index,输入一个子字符串,可以返回子字符串在 str 中第一次出现的索引,若不存在则报错
map(函数,可迭代对象) 将会对(参数2:可迭代对象)中的每个元素运用(参数1:函数)并将结果按顺序储存在一个迭代器中,返回这个迭代器
使用 [……] 可对对象解包,本题中 [map……] 等效于 list(map……)
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
return [*map(s.index, s)] == [*map(t.index, t)]
哈希表
class Solution:
def isIsomorphic(self, s: str, t: str) -> bool:
hashmap={}
for i,j in zip(s,t):
if i in hashmap and hashmap[i]!=j:
return False
elif i not in hashmap and j in hashmap.values():
return False
hashmap[i]=j
return True
比较特征值
特征值: 每个字符都有一个各不相同的代号, 这些代号按照字符串中字符的顺序排列组成了特征值
初始特征值为"", 字典L初始值为空
若字符串不为空, 则将第一个字符的代号设为"1"接到特征值末尾并加入字典
往后每遇到一个字符, 若其在字典里, 取出对应代号并接到特征值末尾, 若不在, "代号+1"接到特征值末尾并加入字典
比如对于字符串"apple", 其特征值为"12234"
class Solution:
def eigenValues(self, x):#返回一个字符串的特征值
L, p, k = {}, 0, ''
for i in x:
if i not in L:
p += 1
k, L[i] = k+str(p), str(p)
k += L[i]
return k
def isIsomorphic(self, s, t):
return self.eigenValues(s) == self.eigenValues(t)
来源:力扣(LeetCode)