~/algorithm/

205. 同构字符串

#leetcode#algorithm#js

题目描述

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

如果s中的字符可以被替换得到t,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例 1:

输入: (s = "egg"), (t = "add");
输出: true;

示例 2:

输入: (s = "foo"), (t = "bar");
输出: false;

示例 3:

输入: (s = "paper"), (t = "title");
输出: true;

说明:

你可以假设 s 和 t 具有相同的长度。

解题思路

将每个单词的字母出现的位置统计到 map 中,在比较这两个 map 的值。

解法优化

不存储位置,改为相同位置,每个单词的字母分别作为键值对,当出现不匹配时,则不是同构的。

代码展示

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
  let map = {},
    map1 = {};
  for (let i = 0; i < s.length; i++) {
    let sChar = s[i];
    let tChar = t[i];
    map[sChar] = map[sChar] || [];
    map1[tChar] = map1[tChar] || [];
    map[sChar].push(i);
    map1[tChar].push(i);
  }
  let r1 = Object.values(map);
  let r2 = Object.values(map1);
  if (r1.length != r2.length) return false;
  return r1.sort().toString() == r2.sort().toString();
};

改进后的代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
  for (let i = 0, map1 = {}, map2 = {}; i < s.length; ++i) {
    if (!map1[s[i]]) map1[s[i]] = t[i];
    if (!map2[t[i]]) map2[t[i]] = s[i];
    if (map1[s[i]] != t[i] || map2[t[i]] != s[i]) return false;
  }
  return true;
};