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

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

};

'''

你可能感兴趣的:(205. Isomorphic Strings)