LeetCode 算法:同构字符串

1,287 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

同构字符串

原题地址

给定两个字符串 s 和 t ,判断它们是否是同构的。

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

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

示例 1:

输入:s = "egg", t = "add"
输出:true

示例 2:

输入:s = "foo", t = "bar"
输出:false

示例 3:

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

提示:

  • 1 <= s.length <= 5 *10410^4
  • t.length == s.length
  • s 和 t 由任意有效的 ASCII 字符组成

思路分析

  1. 首先,判断边界条件,若两个字符串的长度不相同,那么肯定不是同构字符串;
  2. 字符串长度相同时,需要判断相同位置上两个字符串中的字符是否有唯一的映射关系;
  3. 循环数组,另外找一个变量 res 来存储字符的映射关系,那么如果 res[s[i]] 存在,并且 res[s[i]] !== t[i] 这种情况下说明对于 s[i] 来说,t 中存在不唯一的映射,此时肯定不是同构字符串;
  4. 按照 步骤 3 的逻辑,于是很开心的提交了代码后,发现在某个测试用例下没有通过;
  5. 看了下未通过的示例,s: "badc" t: "baba",那么我们可以看到 对于 s 来说映射关系是唯一的,但是对于 t 来说映射关系是不唯一的;
  6. 因此,需要使用两个变量来分别存储 st 的映射关系,在循环过程中按照 步骤 3 来处理两个变量,分别确定各自的映射关系是否唯一;
  7. 修改后,提交,通过了全部的测试用例。

AC 代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isIsomorphic = function(s, t) {
    if(s.length !== t.length) return false
    const res1 = {}
    const res2 = {}
    for(let i = 0; i < s.length; i++) {
        if(res1[s[i]]) {
            if(res1[s[i]] !== t[i]) {
                return false
            } 
        } else {
            res1[s[i]] = t[i]
        }

        if(res2[t[i]]) {
            if(res2[t[i]] !== s[i]) {
                return false
            } 
        } else {
            res2[t[i]] = s[i]
        }
    }
    return true
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了80.56%的用户
  • 内存消耗:42.9 MB, 在所有 JavaScript 提交中击败了26.70%的用户
  • 通过测试用例:43 / 43

END