题目
难度:★★☆☆☆
类型:字符串
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
说明:
你可以假设 s 和 t 具有相同的长度。
示例
示例 1:
输入: s = "egg", t = "add"
输出: true
示例 2:
输入: s = "foo", t = "bar"
输出: false
示例 3:
输入: s = "paper", t = "title"
输出: true
解答
方案1:去重
同构的字符串,对应位置可以相互替换,我们可以把对应位置的两个字符拿出来,组成一个元组,用集合的方式去重,保证两个字符串去重后的长度和元素集合的长度相同即可,例如单词“paper”和“title”两个字符串,就有:
set("paper") = {"p", "a", "e", "r"},长度为4;
set("title") = {"t", "i", "l", "e"},长度为4;
而zip("paper", "title") = [("p", "t"), ("a", "i"), ("p", "t"), ("e", "l"), ("r", "e")]
set(zip("paper")) = {("p", "t"), ("a", "i"), ("e", "l"), ("r", "e")},长度为4
三者长度相同,所以"paper"和"title"同构。
class Solution(object):
def isIsomorphic(self, s, t):
"""
:type s: str
:type t: str
:rtype: bool
"""
return len(set(s)) == len(set(t)) == len(set(zip(s, t)))
方案2:下标位置
同步遍历两个字符串,如果存在相同位置的两个字符在之后的的字符串中出现的位置不同,则一定不同构,如果所有位置均满足条件,则两个字符串同构。
class Solution:
def isIsomorphic(self, s, t):
for i in range(len(s)):
if s[i + 1:].find(s[i]) != t[i + 1:].find(t[i]):
return False
return True
如有疑问或建议,欢迎评论区留言~