算法题解-同构字符串

132 阅读2分钟

题目

给定两个字符串 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
};

坚持努力,无惧未来!