在javascript中使用单个映射检查同构字符串



如果一个单词中的字母可以重新映射得到第二个单词,则称两个单词同构。重新映射一个字母意味着用另一个字母替换所有出现的字母,而字母的顺序保持不变。没有两个字母可以映射到同一个字母,但一个字母可以映射到自己。

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

最新更新