LeetCode笔记:同构字符串

问题

给定两个字符串  s 和  t ,判断它们是否是同构的。

如果  s 中的字符可以按某种映射关系替换得到  t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入: s = "egg", t = "add"

输出: true

示例 2:

输入: s = "foo", t = "bar"

输出: false

示例 3:

输入: s = "paper", t = "title"

输出: true

提示:

  • 可以假设  st 长度相同。

解法

思路:

观察同构字符串,能够得出两个规律:

  • 如果两边的字符串都是新出现的,则满足同构的条件
  • 如果有重复出现的字符串,则需要保证重复出现字符串和之前出现的元素一致

具体步骤是

  1. 定义两个对象,在遍历字符串的时候,将每一个字符串做一个 s => tt => s的映射
  2. 重点就是判断当字符串重复出现的时候,是否还能保持之前的映射关系,当然,如果是新出现的,也是满足条件的

代码:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function (s, t) {
  // 存储每个字符串,用作对比
  const sObj = {},
    tObj = {};
  for (let i = 0; i < s.length; i++) {
    // 取出每一个字符串
    const x = s[i],
      y = t[i];
    // 如果是第一次出现的字符,就存储下来,如果最终发现所有的字符串都是第一次出现,则是同构字符串
    // 如果之前出现过的字符,就要判断xy是不是互为映射,只要有一个不是映射,就不是同构字符串了
    if ((sObj[x] && sObj[x] !== y) || (tObj[y] && tObj[y] !== x)) {
      return false;
    }
    // 将第一次出现的字符串存储起来
    sObj[x] = y;
    tObj[y] = x;
  }
  return true;
};

参考

评论