题目
给定两个字符串 s 和 t ,判断它们是否是同构的。
输入: s = "egg", t = "add" 输出: true
题解
第一种
我们在函数中先判断两个字符串的长度是否相等,如果不相等我们则直接返回false,然后我们声明一个变量n表示字符串的长度和两个Map对象,分别是map1变量和map2变量,然后我们在使用一个for循环进行遍历字符串s和t,我们将s作为它们key,对应的t中的字符作为value,分别存入map1变量和map2变量中,在存入之前我们判断一下当前字符是否已经存在于map1或者对应的value是否已经存在于map2中,如果存在我们则需要判断它们之前是否已经建立了映射关系,如果之前的映射关系与当前不一致,我们则返回false,否则我们就将当前字符和对应的value存入map1变量和map2变量中,当循环完成后我们如果并没有返回false,则说明两个字符串是同构的,我们返回true即可
var isIsomorphic = function(s, t) { if(s.length!==t.length) return false let n = s.length; let map1 = new Map() let map2 = new Map() for(let i=0;i<n;i++){ let key = s[i] let value = t[i] if(map1.has(key) || map2.has(value)){ if(map1.get(s[i])!==value || map2.get(t[i])!==key){ return false } }else{ map1.set(key,value) map2.set(value,key) } } return true };
第二种
我们首先在函数中声明了一个空的对象M和一个空的集合set,这里用于记录字符的映射关系,然后我们获取到两个字符串的长度通过for进行循环遍历每个字符,将其分别存储到变量x和y中,然后我们使用条件判断进行判断当前x在对象M中是否已经有了对应的映射字符且这个映射字符不等于y,如果满足则说明两个字符串不满足同构的条件,我们直接返回false即可,如果y在集合set中已经存在则说明y已经被映射到了其他字符,也不满足同构的条件,我们也直接返回false,如果上述判断都不满足则说明当前字符可以作为一个新的映射关系,我们将其存储到对象M和集合set中,当循环结束后没有返回false,我们直接返回true即可
var isIsomorphic = function(s, t) { const M = {} const set = new Set() const n = s.length for (let i = 0; i < n; i ++) { const x = s[i] const y = t[i] if (x in M) { if (M[x] !== y) { return false } } else if (set.has(y)) { return false } else { M[x] = y set.add(y) } } return true };