给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
-
示例 1:
输入:s = "egg", t = "add"
输出:true
-
示例 2:
输入:s = "foo", t = "bar"
输出:false
-
示例 3:
输入:s = "paper", t = "title"
输出:true
说明: 你可以假设 s 和 t 具有相同的长度。
代码1:
bool isIsomorphic(string s, string t) {
unordered_map<char, char> sm; // s->t
unordered_map<char, char> tm; // t->s
for(int i=0; i<s.length(); i++)
{
if(sm.find(s[i]) == sm.end() && tm.find(t[i]) == tm.end()) // 两个map里都没有
{
sm[s[i]] = t[i]; // 保存s对应字符 在t上的映射值
tm[t[i]] = s[i]; // 保存t对应字符 在s上的映射值
cout << "s: " << s[i] << "->" << sm[s[i]] << "\nt: " << t[i] << "->" << tm[t[i]];
}
else if(sm.find(s[i]) != sm.end() && tm.find(t[i]) != tm.end()) // 都有映射关系了
{
if(sm[s[i]] != t[i] || tm[t[i]] != s[i]) // 只要其中一个的映射对应不上 就一定不是同构
return false;
}
else // 一个已经有映射关系了,而另一个还没出现过,就一定不是同构
return false;
}
return true; // 每个都对应上了,肯定是同构
}
代码2:
bool isIsomorphic(string s, string t) {
char sm[256] = { 0 }; // 初始化值为0
char tm[256] = { 0 };
for(int i=0; i<s.length(); i++)
{
if(sm[s[i]] != tm[t[i]]) return false; // 如果对应字符 上次出现的位置 不一样,不是同构
sm[s[i]] = i + 1; // 记录字符上次出现的位置
tm[t[i]] = i + 1;
}
return true;
}