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;
};
'''