leetcode 205.同构字符串

leetcode 205.同构字符串

题目描述

给定两个字符串 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=“aabaa”, t=“ccdee”,s和t就不是同构字符串,因为在s->t的过程中,‘a’的映射关系是’a’->‘c’、‘a’->‘e’,即’c’和’e’同时映射到’a’上了,所以不符合。那么知道了这个以后,就可以通过建立一个哈希表来判断是否同构。首先我们需要知道s->t映射的过程中是否同构,然后在判断t->s是否同构,两个同时满足的时候,才能代表s、t是同构字符串。为什么要判读两次呢,举个例子:s = “bar”, t = “foo”,在映射的过程中,看下表:

s->t t->s
‘b’->‘f’ ‘f’->‘b’
‘a’->‘o’ ‘o’->‘a’
‘r’->‘o’ ‘o’->‘r’

从表格上,如果建立哈希对应感谢,s->t的过程中是判断不出来是否为同构,但是t->s过程中,就可以看出来’o’不是一一对应的,所以要进行两次判读,同时为true的时候,才可以判断是同构字符串

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        if(s.size() != t.size()){  // 如果两个字符串的长度不相等,表示两个是非同构字符串
            return false;
        }
        
        return helper(s, t) && helper(t, s);
    }

    bool helper(string str1, string str2){
        unordered_map<char, char> map;   //建立映射哈希表
        int len = str1.size();
        for(int i=0; i<len; i++){
            if(map.find(str1[i]) == map.end()){     // 表中是否存在,不存在添加数据
                map[str1[i]] = str2[i];
            }
            else{
                if(map[str1[i]] != str2[i]){       // 如果存在判断map的键对应的值是否和当前str2中的值相等,如果不相等表示存在一对多的问题,返回false
                    return false;
                }
            }
        }
        return true;
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

发布了135 篇原创文章 · 获赞 164 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/103840961