原题链接:
https://leetcode.cn/problems/isomorphic-strings/
理解题意:
-
s = "foo"和t = "bar",s中的o同时映射了a和r,不正确 -
s = "badc"和t = "baba",t中的a同时映射了a和c,不正确 - 因此需要同时检查
s到t和t到s的映射关系
解题思路:
- 用两个
Map,分别存储s -> t和t -> s的映射关系 - 遍历字符串,查看
Map中存储的映射关系是否与遍历到的字符不同,出现不同就表示两个字符串不是同构的 - 如果正常退出循环,表示没意义找到不同的映射关系,两个字符串是同构的
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function(s, t) {
const maps2t = new Map() // 存储s到t的映射关系
const mapt2s = new Map() // 存储t到s的映射关系
// 遍历每个字符,对比它们之间的映射关系
for (let i = 0; i < s.length; i++) {
// 如果s[i]到t[i]的映射,以及t[i]到s[i]的映射出现不相同的情况
// 表示出现一个字符可以映射到两个不同字符,返回false
if (
(maps2t.has(s[i]) && maps2t.get(s[i]) !== t[i]) ||
(mapt2s.has(t[i]) && mapt2s.get(t[i]) !== s[i])
) {
return false
}
// 每次循环都存储一次映射关系
maps2t.set(s[i], t[i])
mapt2s.set(t[i], s[i])
}
// 如果没有找到错误的映射关系,正常退出循环,表示每个字符都能正常映射
return true
};