算法题解-同构字符串

简介: 算法题解-同构字符串

题目


给定两个字符串 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
};
相关文章
|
2月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
15天前
|
算法
两个字符串匹配出最长公共子序列算法
本文介绍了最长公共子序列(LCS)问题的算法实现,通过动态规划方法求解两个字符串的最长公共子序列,并提供了具体的编程实现细节和示例。
41 1
两个字符串匹配出最长公共子序列算法
|
2月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
3月前
|
自然语言处理 算法 搜索推荐
字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析
在自然语言处理领域,人们经常需要比较字符串,这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似,或者相似度是好还是差。这类似于我们使用手机打错一个词,但手机会建议正确的词来修正它,那么这种如何判断字符串相似度呢?本文将详细介绍这个问题。
253 1
|
3月前
|
数据采集 算法 JavaScript
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
JavaScript字符串搜索涵盖`indexOf`、`includes`及KMP算法。`indexOf`返回子字符串位置,`includes`检查是否包含子字符串。KMP是高效的搜索算法,尤其适合长模式匹配。示例展示了如何在数据采集(如网页爬虫)中使用这些方法,结合代理IP进行安全搜索。代码示例中,搜索百度新闻结果并检测是否含有特定字符串。学习这些技术能提升编程效率和性能。
100 1
揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法
|
2月前
|
算法 C++
惊爆!KPM算法背后的秘密武器:一行代码揭秘字符串最小周期的终极奥义,让你秒变编程界周期大师!
【8月更文挑战第4天】字符串最小周期问题旨在找出字符串中最短重复子串的长度。KPM(实为KMP,Knuth-Morris-Pratt)算法,虽主要用于字符串匹配,但其生成的前缀函数(next数组)也可用于求解最小周期。核心思想是构建LPS数组,记录模式串中每个位置的最长相等前后缀长度。对于长度为n的字符串S,其最小周期T可通过公式ans = n - LPS[n-1]求得。通过分析周期字符串的特性,可证明该方法的有效性。提供的C++示例代码展示了如何计算给定字符串的最小周期,体现了KPM算法在解决此类问题上的高效性。
68 0
|
4月前
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
3月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
4月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
4月前
|
存储 算法 Java
Java数据结构与算法:用于高效地存储和检索字符串数据集
Java数据结构与算法:用于高效地存储和检索字符串数据集