Isomorphic Strings

题目

Given two strings s and t, determine if they are isomorphic.

Two strings are isomorphic if the characters in s can be replaced to get t.

All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.

Example 1:

Input: s = "egg", t = "add"
Output: true
Example 2:

Input: s = "foo", t = "bar"
Output: false
Example 3:

Input: s = "paper", t = "title"
Output: true
Note:
You may assume both s and t have the same length.

总结

这道题稍微有点绕,提交了5次才AC。仔细审题很重要…题目要求可以精简为:
给一个字符串s,一个字符串t。
1,任何s中个不同的字符不能映射到t中相同的字符
2,任何s中相同的字符必须映射到t中相同的字符
(反过来一样,任意t中不同的字符不能映射到s中相同的字符,任何t中相同的字符必须映射到s中相同的字符)

思路一: 用map保存映射关系,同时用一个set(hash)保存之前s已经映射过的值。map用于验证第2点,set用于验证第1点
代码:

class Solution:
    def isIsomorphic(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """     
        maped = set()
        dict = {}
        for i in range(len(s)):
            if s[i] in dict:
                if t[i] != dict[s[i]]:
                    return False
            else:
                if t[i] in maped:
                    return False
                dict[s[i]] = t[i]
                maped.add(t[i])
        return True

思路二:
ASCII一共有256个,可以用两个256的数组来记录映射关系。对于每对映射,分别把对应数组对应位置设置为一个相同的数(每次设置的数不能和之前重复),这样,每当要添加一对新的映射时,只要数组中对应位置的值不相同,说明新的映射不符合上述要求1,2中的某一点。(可以设想,如果所有的数据都符合1,2点,那么每次加入新的映射,之前的值都必然相同)
解释的不是很好,看代码理解吧

class Solution:
    def isIsomorphic(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        m1 = [-1] * 256
        m2 = [-1] * 256

        for i in range(len(s)):
            if m1[ord(s[i])] != m2[ord(t[i])]:
                return False
            m1[ord(s[i])] = i
            m2[ord(t[i])] = i
        return True

上面的代码其实不是很好,因为当字符串远小于256的时候会浪费很多空间,可以考虑用map代替数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值