【字符串】力扣205:同构字符串

给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例1:

输入:s = "paper", t = "title"
输出:true

示例2:

输入:s = "foo", t = "bar"
输出:false

法1:哈希表

1

由题意,需要判断 s 和 t 每个位置上的字符是否都一一对应,即 s 的任意一个字符被 t 中唯一的字符对应,同时 t 的任意一个字符被 s 中唯一的字符对应。这也被称为「双射」的关系。
注意,这里的一一对应不是严格对应,而是两组分开,map 里键不能相等,但是值能相等。如示例1,s 中的字符 e 有唯一的映射 l,但 s 中的字符 e 来说,其映射结果不是 t 中的 l,而是 r。

以示例2 为例,t 中的字符 a 和 r 虽然有唯一的映射 o,但对于 s 中的字符 o 来说其存在两个映射 {a,r},故不满足条件。

使用字典统计,首先判断长度是否相等,若不等则直接返回 False,然后遍历字符串,若字典value值不对应则直接返回 False,最后遍历完都对应返回 True 即可。

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        m, n = len(s), len(t)
        if m != n:
            return False
        dic1, dic2 = {}, {}
        for i in range(m):
            if s[i] not in dic1: # 填充dic1
                dic1[s[i]] = t[i]
            if t[i] not in dic2: # 填充dic2
                dic2[t[i]] = s[i]
            # 判断映射关系是否满足一对一
            if dic1[s[i]] != t[i] or dic2[t[i]] != s[i]:
                return False
        return True

时间复杂度:O(n),其中 n 为字符串的长度。我们只需同时遍历一遍字符串 s 和 t 即可。
空间复杂度:O(∣Σ∣),其中 Σ 是字符串的字符集。哈希表存储字符的空间取决于字符串的字符集大小,最坏情况下每个字符均不相同,需要 O(∣Σ∣) 的空间。

2. 利用dict.get()函数

get(key, value) 满足了还没有完成配对字符出现的None值的情况

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        hashmap1 = {}
        hashmap2 = {}
        for c1, c2 in zip(s, t):
            if hashmap1.get(c1, c2) != c2 or hashmap2.get(c2, c1) != c1:
                return False
            hashmap1[c1] = c2
            hashmap2[c2] = c1
        return True

python取巧

由于题目说明了 len(s) == len(t),所以可以不必为了逻辑判断源字符串长度

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        return len(set(s)) == len(set(t)) and len(set(s)) == len(set(zip(s, t)))

更简单的版本

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        return len(set(s)) == len(set(t)) == len(set(zip(s, t)))
posted @   Vonos  阅读(77)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示