自己的写法,使用双向映射。
/*class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size() != t.size())
return false;
map<char,char> m;
for(int i = 0;i < s.size();++i){
if(m.find(s[i]) != m.end()){
if(m[s[i]] != t[i])
return false;
}
else{
m[s[i]] = t[i];
}
}
return true;
//要双向映射,只有一个方向是不够的
}
};*/
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size() != t.size())
return false;
map<char,char> m1;// s to t
map<char,char> m2;// t to s
for(int i = 0;i < s.size();++i){
//if all the map are not find
if(m1.find(s[i]) == m1.end() && m2.find(t[i]) == m2.end()){
m1[s[i]] = t[i];
m2[t[i]] = s[i];
}
else if(m1.find(s[i]) != m1.end() || m2.find(t[i]) != m2.end()){
//if find in the first map
if(m1[s[i]] != t[i] || m2[t[i]] != s[i])
return false;
}
}
return true;
}
};
错误的写法
/*class Solution {
public:
bool isIsomorphic(string s, string t) {
unordered_map<char,int> m1,m2;
for(int i = 0;i < s.size();i++){
m1[s[i]] += (i + 1);
//对每一个字母出现的位置求和,两个字母在相同的地方出现的时候每次的和一致,
//如果是最后的和一致不太能判断
//一定是第几个位置,不是下标的和,否则会出问题。
m2[t[i]] += (i + 1);
if(m1[s[i]] != m2[t[i]])
return false;
}
return true;
}
"abbaa"
"cddcd"
};*/