给定两个字符串 s
和 t
,判断它们是否是同构的。
如果 s
中的字符可以按某种映射关系替换得到 t
,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s ="egg"
, t ="add"
输出:true
示例 2:
输入:s ="foo"
, t ="bar"
输出:false
示例 3:
输入:s ="paper"
, t ="title"
输出:true
提示:
1 <= s.length <= 5 * 104
t.length == s.length
s
和t
由任意有效的 ASCII 字符组成
function isIsomorphic(s: string, t: string): boolean {
const len = s.length;
if (len !== t.length) return false;
//保存两个映射关系,在检查时,要进行双向映射检查
const sHashMap = new Map<string, string>();
const tHashMap = new Map<string, string>();
for (let i = 0; i < len; i++) {
const sv = s[i],
tv = t[i];
const hasSv = sHashMap.has(sv),
hasTv = tHashMap.has(tv);
// 如果在 s 的哈希表中有值,并且值不等于 t 相应位置的值,则没有一一对应
// 例如: s "aaa", t "abc" ,哈希表为 [[a,a],[a,b],[a,c]]
// 如果在 t 的哈希表中有值,并且值不等于 s 相应位置的值,则没有一一对应
// 例如: s "abc", t "aaa" ,哈希表为 [[a,a],[b,a],[c,a]]
if (
(hasSv && sHashMap.get(sv) !== tv) ||
(hasTv && tHashMap.get(tv) !== sv)
) {
return false;
}
//向哈希表中添加值
hasSv || sHashMap.set(sv, tv);
hasTv || tHashMap.set(tv, sv);
}
return true;
}