原题链接:
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
};