思路:这里也还是使用hash来解决这一题,只不过这里用一个map是不能解决的,需要两个map来正反互相指向才行
错误代码
这里只只用了一个map来解决,只不过在遇到以下测试用例的是时候,会报错
这里主要的问题就是,指向的value会重复的问题,如果不用两个map,这里的代码就会重置当前的k-v对,进而导致错误
对于测试用例 s = badc, t = baba,遍历到d的时候就有 {d:b},但是之前就有 {b:b}这个k-v,所以这里要借助两个map才能行
var isIsomorphic = function (s, t) {
let map = new Map()
for (let i = 0; i < s.length; ++i) {
if (map.has(s[i])) {
if (t[i] !== map.get(s[i])) {
return false
}
} else {
map.set(s[i], t[i])
}
}
return true
};
这个错误也比较典型,这里来统计数量,然后进行排序,但是无法ac
测试用例
s ="bbbaaaba"
t ="aaabbbba"
这里就要求ab对应,但是在倒数第二个位置,这里就没有对应起来
var isIsomorphic = function (s, t) {
let arrS = new Array(26).fill(0);
let arrT = new Array(26).fill(0);
let a = "a".charCodeAt(0);
for (let i = 0; i < s.length; ++i) {
arrS[s[i].charCodeAt(0) - a]++;
arrT[t[i].charCodeAt(0) - a]++;
}
arrS.sort((a, b) => b - a);
arrT.sort((a, b) => b - a);
for (let i = 0; i < 26; ++i) {
if (arrS[i] !== arrT[i]) return false;
}
return true;
};
正确代码
使用map映射
var isIsomorphic = function (s, t) {
let mapST = new Map()
let mapTS = new Map()
for (let i = 0; i < s.length; ++i) {
if (mapST.has(s[i])) {
if (t[i] !== mapST.get(s[i])) {
return false
}
} else if (mapTS.has(t[i])) {
if (s[i] !== mapTS.get(t[i])) {
return false
}
} else {
mapST.set(s[i], t[i])
mapTS.set(t[i], s[i])
}
}
return true
};
使用数组映射
var isIsomorphic = function (s, t) {
let mapST = new Array(256).fill(-1)
let mapTS = new Array(256).fill(-1)
for (let i = 0; i < s.length; ++i) {
let charS = s.charCodeAt(i)
let charT = t.charCodeAt(i)
if (mapST[charS] === -1 && mapTS[charT] === -1) {
mapST[charS] = t[i]
mapTS[charT] = s[i]
} else if (mapST[charS] !== t[i] || mapTS[charT] !== s[i]) {
return false
}
}
return true
};