205. Isomorphic Strings

Given two strings s and t, determine if they are isomorphic.

Two strings are isomorphic if the characters in s can be replaced to get t.

All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.

For example,
Given "egg", "add", return true.

Given "foo", "bar", return false.

Given "paper", "title", return true.

Note:
You may assume both s and t have the same length.

最开始的想法是使用一个Map1来记录映射关系,一个Map2纪录在t中字母是不是已经被使用过
如果是之前s中没出现过的字母:
——检查这个字母在t中的映射是不是被使用过了:
————如果没有,就在Map1中纪录这个映射关系,并在Map2中纪录t中这个字母已经使用过了
————如果使用过了,那就代表出现了重复映射,返回false
如果是出现过的:
——检查是否符合映射关系

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
    var map = {};
    var used = {};
    var num = s.length;
    for (var i = 0; i<num;i++) {
        var temp = s.charCodeAt(i)-t.charCodeAt(i);
        if (map[s[i]]===undefined) {
            if (used[t[i]]===undefined) {
                map[s[i]] = temp;
                used[t[i]] = true;
            } else
                return false;
        }   
        else {
            if (temp!==map[s[i]])
                return false;
        }
    }
    return true;
}

另一种方法比较巧,使用两个对象,一个纪录s中字母出现的位置,一个纪录t中字母出现的位置。
同时循环这两个字符串,每一步,检查相同位置上的字母上次出现的位置是否相同,如果相同,就保证了已经检查过的字符串是符合要求的。如果这两个字母上次出现的位置是不同的,那现在出现在了相同的位置,那就不对了。
这里有一点可以优化的,当确认当前检查的字母是已经出现过的,且符合映射关系的时候,就不需要纪录当前元素的位置了,因为我们需要的仅仅是映射信息,第一次出现的时候我们就有这个信息了。
'''
var isIsomorphic = function(s, t) {
var ss = {};
var ts = {};
var num = s.length;
for (var i = 0; i<num;i++) {
if(ss[s[i]] != ts[t[i]]) return false;
else if(!ts[t[i]]) //only record once
{
ss[s[i]] = i;
ts[t[i]] = i;
}

}
return true;

};

'''

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容