题目
给定两个字符串
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
};
坚持努力,无惧未来!