[LeetCode] 205. 同构字符串

题目链接:https://leetcode-cn.com/problems/isomorphic-strings/

题目描述:

给定两个字符串 s 和 t,判断它们是否是同构的。

如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例:

示例 1:

输入: s = "egg", t = "add"
输出: true

示例 2:

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

示例 3:

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

说明:

你可以假设 s 和 t 具有相同的长度。

思路:

解释题意:s中字母对应t中一个字母,位置也是对应的。但是,不能映射两个,比如aa , aba对应a,又对应b

思路一:

先把st各自分组,什么意思呢?就是连续出现相同的字符有一组,如何同一位置,连续相同的个数都不一样说明,不能映射,再哈希判断字符是否对应。

思路二:用两个字典

就是看映射的字母位置是相同的

直接看代码理解吧!

如有不清楚地方,欢迎留言!

代码:

思路一:

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        lookup = {}
        for a, b in zip(itertools.groupby(s), itertools.groupby(t)):
            #print(a, b)
            a1, a2 = a[0], a[1]
            b1, b2 = b[0], b[1]
            if len(list(a2)) != len(list(b2)):
                return False
            if a1 not in lookup:
                lookup[a1] = b1
            else:
                if lookup[a1] != b1:
                    return False
        return True

思路二:

class Solution:
    def isIsomorphic(self, s: str, t: str) -> bool:
        from collections import defaultdict
        lookup1 = defaultdict(lambda:-1)
        lookup2 = defaultdict(lambda:-1)
        for i in range(len(s)):
            if lookup1[s[i]] != lookup2[t[i]]: return False
            lookup1[s[i]] = i
            lookup2[t[i]] = i
        return True           

posted on 2019-08-17 20:47  威行天下  阅读(183)  评论(0编辑  收藏  举报

导航