【Leetcode 205 】 同构字符串——双向映射

24 阅读1分钟

给定两个字符串 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;
}