如果一个单词中的字母可以重新映射得到第二个单词,则称两个单词同构。重新映射一个字母意味着用另一个字母替换所有出现的字母,而字母的顺序保持不变。没有两个字母可以映射到同一个字母,但一个字母可以映射到自己。
Example:
('ABC','XYZ') //true
('ABCCBA','XYZZYX') //true
('ABCABC','XYXXYX') //false
我的代码使用了两个hashmap。是否有一种方法来做到这一点,使用一个单一的哈希映射?
使用两个映射的代码:
function isomorphic(str1, str2){
if(str1.length !== str2.length) return false;
var map1={}, map2={};
for (var i=0; i< str1.length;i++) {
if (typeof map1[str1[i]] == "undefined" && typeof map2[str2[i]] == "undefined"){
map1[str1[i]] = str2[i];
map2[str2[i]] = str1[i];
}
else{
if(map1[str1[i]] !== str2[i] && map2[str2[i]] !== str1[i]){
return false;
}
}
}
return true;
}
应该可以了
function isomorphic(str1, str2) {
if (str1.length !== str2.length) {
return false;
}
var map = {};
for(var i = 0; i < str1.length; i++) {
var a = str1[i];
var b = str2[i];
if (typeof map[a] === "undefined") {
map[a] = b;
// check for error in first tuple ("ABB", "XYZ")
} else if (map[a] !== b) {
return false;
}
// check for error in second tuple ("ABC", "XYY")
for (var key in map) {
if (key !== a && b === map[key]) {
return false;
}
}
}
return true;
}
isomorphic("ABC", "XYZ"); //true
isomorphic("ABCCBA", "XYZZYX"); //true
isomorphic("ABCABC", "XYXXYX"); // false