一、题目描述
给定两个字符串 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 * 104t.length == s.lengths和t由任意有效的 ASCII 字符组成
二、思路分析
- 根据题意:如果两个字符串相等,则返回
true - 根据题意:如果字符串不相等,则返回
false - 接下来就是长度相等的情况,定义两个对象
-
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
};