前端算法-字符串同构

1,733 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

题目

给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

输入: s = "paper", t = "title"
输出: true

思路一

我们这里可以使用Map数据结构进行实现,我们进入函数后先判断s形参和t形参是否相等,相等则直接同构,如果不相等,我们则创建两个变量,分别是sMap变量和tMap变量,他们是两个Map数据结构实例,用于存储s形参和t形参的数据,然后我们使用循环进行循环s形参,在循环中我们使用Map数据结构的方法进行判断s形参或者t形参当前的数据是否存在sMap变量或者tMap变量中,如果都不在sMap变量或者tMap变量中,则把当前s形参和t形参循环中的当前字符使用Map数据结构的set方法添加到sMap变量或者tMap变量中,如果都存在sMap变量或者tMap变量中,则分别在sMap变量或者tMap变量中查到到该字符并且返回对应的键值。若键值不相等,则直接返回false,若键值相等,则把该字母添加进对应的Map实例中,若只有其中一个存在于对于的Map数据结构中,那么我们也是在对应的Map实例中查找该字符,将查找到的返回键值,查到不到的返回undefined,否则就则直接返回false,如果最后可以全部都遍历结束,则直接返回true,即是同构字符串

var isIsomorphic = function(s, t) {
    if( s === t ){
       return true
    } 
    let sMap = new Map(), tMap = new Map()
    for( let i = 0; i < s.length; i++) {
        if (sMap.has(s[i]) || tMap.has(t[i])){
            if(sMap.get(s[i]) !== tMap.get(t[i]))
                return false
        }
        sMap.set(s[i], i)
        tMap.set(t[i], i)
    }
    return true   
};