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;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步