【力扣】205.同构字符串|每日一题|刷题打卡

156 阅读2分钟

一、题目描述

给定两个字符串 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 字符组成

二、思路分析

  1. 根据题意:如果两个字符串相等,则返回 true
  2. 根据题意:如果字符串不相等,则返回 false
  3. 接下来就是长度相等的情况,定义两个对象
    • mp的作用是:判断每个出现的字符都应当映射到另一个字符,如果存在了,则判断值是否是同一个,如果不是,则返回false

    • val的作用是:会出现每个字符都不一致,则可以映射,但是会出现相同的字符,所以需要将存储的val保存起来,看两者的长度是否相等,具体示例是:s='badc', t='baba' 的情况

      这样的话 mp: { b: 'b', a: 'a', d: 'b', c: 'a' }val: { b: 'b', a: 'a' },则不满足题意:相同字符只能映射到同一个字符上

三、代码答案

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function (s, t) {
  if (s === t) return true
  if (s.length !== t.length) return false
  const mp = {}
  const val = {}
  for (var i = 0; i < s.length; i++) {
    if (mp[s[i]]) {
      if (mp[s[i]] !== t[i]) return false
    } else {
      val[t[i]] = t[i]
      mp[s[i]] = t[i]
    }
  }
  if (Object.values(val).length !== Object.values(mp).length) return false
  return true
};