当前位置: 首页 > article >正文

Leetcode 同构字符串

在这里插入图片描述

这道题的意思,其实就是要求,从s->t和从t->s这两个单向映射只要重复的字符映射关系保持一致就okay,所以我们需要创建2个哈希表。
是的,你理解得很正确!这道题的核心要求就是确保两个字符串之间的映射关系是一致且唯一的。也就是说:

  1. s -> t 的映射中,每个字符在 s 中出现的位置映射到 t 中的字符时,保持一致
  2. t -> s 的映射中,每个字符在 t 中出现的位置映射回 s 时,也保持一致

换句话说

  • 如果 s 中的某个字符多次出现在相同的位置上,那么它必须始终映射到 t 中同一位置的字符。
  • 同样地,如果 t 中的某个字符多次出现在相同的位置上,那么它必须始终映射到 s 中同一位置的字符。

举例说明

  • 比如 s = "egg"t = "add"

    • s -> te -> ag -> d,且每个 g 都对应 d,符合要求。
    • t -> sa -> ed -> g,且每个 d 都对应 g,符合要求。
  • 如果 s = "foo"t = "bar"

    • s -> tf -> bo -> a(但是遇到 o 时,再次对应 a,符合要求)。
    • t -> sb -> fa -> o,但 r -> o,不一致,不满足同构条件。

总结

所以,这道题的要求确实可以归结为:s -> tt -> s 的双向映射中,每个重复字符的映射关系要保持一致。通过两个哈希表的方式可以帮助我们准确地检测这种一致性。

算法的基本思想是使用两个哈希映射来建立字符的双向映射关系,并检查两个字符串是否满足同构条件。以下是详细的解释:

算法思想

  1. 建立双向映射:我们使用两个哈希映射 mapSmapT,分别用于存储 st 的映射关系和 ts 的映射关系。这是因为如果字符串 s 中的字符可以映射到 t 中的字符,那么 t 中的字符也应该唯一地映射到 s 中的字符。

  2. 逐字符检查映射关系

    • 遍历字符串 st,对每一对对应位置的字符 c1(来自 s)和 c2(来自 t)进行检查。
    • 检查 c1mapS 中是否已经存在映射关系:
      • 如果存在,则判断当前字符 c1 的映射值是否为 c2,如果不是,说明映射冲突,返回 false
      • 如果不存在,则将 c1c2 的映射关系添加到 mapS 中。
    • 同样,检查 c2mapT 中的映射关系:
      • 如果存在,则判断当前字符 c2 的映射值是否为 c1,如果不是,说明映射冲突,返回 false
      • 如果不存在,则将 c2c1 的映射关系添加到 mapT 中。
  3. 返回结果:如果遍历完整个字符串都没有出现映射冲突,说明两个字符串是同构的,返回 true

时间复杂度

由于我们只对字符串 st 进行一次线性扫描,每次扫描的操作都是常数时间的映射查找和插入操作,因此算法的时间复杂度为 (O(n)),其中 (n) 是字符串的长度。

示例

对于输入 s = "egg"t = "add"

  • 第一次循环:c1 = 'e'c2 = 'a',建立 'e' -> 'a''a' -> 'e' 的双向映射。
  • 第二次循环:c1 = 'g'c2 = 'd',建立 'g' -> 'd''d' -> 'g' 的双向映射。
  • 第三次循环:c1 = 'g'c2 = 'd',检查发现映射关系一致,继续。

没有冲突,返回 true

通过这种方法,我们能够有效地判断两个字符串是否同构。

java 实现

class Solution {
    public boolean isIsomorphic(String s, String t) {
        //这道题目的要求是,从s->t和从t->s这两个单向映射只要重复的字符映射关系保持一致就okay
        //首先针对特殊情况进行处理
        //如果s和t的长度都不一致,那肯定不是同构的
        if(s.length() != t.length()) return false;

        //然后创建哈希表
        Map<Character, Character> mapS = new HashMap<>();
        Map<Character, Character> mapT = new HashMap<>();

        //遍历两个字符串
        for(int i = 0; i < s.length(); ++i) {
            //先分别获取s和t的当前字符
            char a = s.charAt(i);
            char b = t.charAt(i);

            if(mapS.containsKey(a)) {//如果哈希表S中已经存在了当前的s字符
                //判断当前的t字符是否和哈希表中的值一致,如果不一致直接返回false
                if(mapS.get(a) != b) return false;
            }else {
                mapS.put(a, b);
            }

            if(mapT.containsKey(b)) {//如果哈希表T中已经存在了当前的t字符
                //判断当前的s字符是否和哈希表中的值一致,如果不一致直接返回false
                if(mapT.get(b) != a) return false;
            }else {
                mapT.put(b, a);
            }

        }
        return true;
        
    }
}

http://www.kler.cn/a/386419.html

相关文章:

  • 844.比较含退格的字符串
  • Spring Boot实现文件上传与OSS集成:从基础到应用
  • C语言 | Leetcode C语言题解之第556题下一个更大元素III
  • 1.7 JS性能优化
  • 优化时钟网络之时钟抖动
  • 申论1_概括、分析
  • 美团代付微信小程序系统 read.php 任意文件读取漏洞复现
  • # SpringMVC学习
  • nginx代理出现的请求头中获取不到acc_token问题
  • 从零开始训练一个大语言模型需要多少天?
  • Python学习从0到1 day26 第三阶段 Spark ① 数据输入
  • 论文阅读(三十五):Boundary-guided network for camouflaged object detection
  • 设置JAVA以适配华为2288HV2服务器的KVM控制台
  • 游戏中Dubbo类的RPC设计时的注意要点
  • 2024系统架构师---上午综合题真题(重复考试知识难点)
  • 【LeetCode】【算法】279. 完全平方数
  • 【GeoJSON在线编辑平台】(1)创建地图+要素绘制+折点编辑+拖拽移动
  • 图像格式中的 stride 和 pix stide
  • SDL 播放PCM
  • 国内读新加坡公立大学在职博士是一种怎样的体验?还中文授课
  • Python学习从0到1 day27 第三阶段 Spark ③ 数据计算 Ⅱ
  • Nuxt3之使用lighthouse性能测试及性能优化实操
  • MySQL 中的 `IN`、`EXISTS` 区别与性能分析
  • Kubernetes-编排工具篇-01-Kustomize与Helm对比
  • 安装和运行开发微信小程序
  • 贪心算法day2(最长递增子序列)