题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
class Solution {
public:
// // 解法一:使用 count 来实现的
// bool isIsomorphic(string s, string t)
// {
// // 搞明白 这两个哈希映射中存储的是什么东东
// // ms 对应的 key 是s中的某个字符,value 是t中的某个字符
// // mt 对应的 key 是t中的某个字符,value 是s中的某个字符
// unordered_map<char, char> ms, mt;
// for(int i = 0; i < s.size(); ++i)
// {
// // 注意 count 中是 key,别写着写着忘记了
// // 两个条件是递进的:s[i] 若存在于 哈希映射中,且映射与 t[i] 不匹配,则返回 false,下一个同理
// if(ms.count(s[i]) > 0 && ms[s[i]] != t[i]) return false;
// if(mt.count(t[i]) > 0 && mt[t[i]] != s[i]) return false;
// ms[s[i]] = t[i];
// mt[t[i]] = s[i];
// }
// return true;
// }
// 解法二:使用 find 来实现的
bool isIsomorphic(string s, string t)
{
unordered_map<char, char> ms, mt;
for (int i = 0; i < s.size(); ++i)
{
// 先判断如果哈希映射中没有这个key,则先加入到哈希中
if (ms.find(s[i]) == ms.end()) ms[s[i]] = t[i];
if (mt.find(t[i]) == mt.end()) mt[t[i]] = s[i];
// 判断是否匹配,有一个不匹配的,就返回 false
if (ms[s[i]] != t[i] || mt[t[i]] != s[i]) return false;
}
return true;
}
};