LeetCode题练习与总结:交错字符串--97

news2024/10/5 13:53:38

一、题目描述

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

两个字符串 st 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空

子字符串:

示例 1:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
输出:true

示例 2:

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
输出:false

示例 3:

输入:s1 = "", s2 = "", s3 = ""
输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 s3 都由小写英文字母组成

二、解题思路

1. 状态定义:创建一个二维布尔数组 dp,其中 dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i+j 个字符。

2. 状态转移方程:对于 dp[i][j],它可以从两个状态转移而来:

  • dp[i-1][j] 且 s1[i-1] == s3[i+j-1],这意味着 s1 的第 i-1 个字符和 s3 的第 i+j-1 个字符相同,那么如果 dp[i-1][j] 为真,dp[i][j] 也为真。
  • dp[i][j-1] 且 s2[j-1] == s3[i+j-1],这意味着 s2 的第 j-1 个字符和 s3 的第 i+j-1 个字符相同,那么如果 dp[i][j-1] 为真,dp[i][j] 也为真。

3. 初始化dp[0][0] 应该初始化为 true,因为没有字符的情况下,当然可以构成一个空字符串。对于第一行和第一列,我们需要检查 s1 和 s3 以及 s2 和 s3 的对应字符是否相等。

4. 结果dp[s1.length()][s2.length()] 的值就是最终结果。

三、具体代码

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        int len1 = s1.length();
        int len2 = s2.length();
        int len3 = s3.length();
        
        // 如果 s1 和 s2 的长度之和与 s3 的长度不相等,那么 s3 不能由 s1 和 s2 交错组成
        if (len1 + len2 != len3) {
            return false;
        }
        
        // dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i+j 个字符
        boolean[][] dp = new boolean[len1 + 1][len2 + 1];
        
        // 初始化 dp 数组
        dp[0][0] = true;
        for (int i = 1; i <= len1; i++) {
            dp[i][0] = dp[i - 1][0] && s1.charAt(i - 1) == s3.charAt(i - 1);
        }
        for (int j = 1; j <= len2; j++) {
            dp[0][j] = dp[0][j - 1] && s2.charAt(j - 1) == s3.charAt(j - 1);
        }
        
        // 状态转移
        for (int i = 1; i <= len1; i++) {
            for (int j = 1; j <= len2; j++) {
                dp[i][j] = (dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1)) ||
                           (dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1));
            }
        }
        
        // 返回结果
        return dp[len1][len2];
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 初始化 dp 数组的时间复杂度为 O(1),因为只设置了数组的两个边界。
  • 接下来的两个循环用于填充 dp 数组的边界,每个循环的时间复杂度分别为 O(len1) 和 O(len2)。
  • 最后的两个嵌套循环用于根据状态转移方程填充 dp 数组的其余部分,时间复杂度为 O(len1 * len2)。
  • 综上所述,总的时间复杂度为 O(len1 + len2 + len1 * len2),由于在实际情况中,len1 * len2 的项通常比 len1 和 len2 大得多,因此可以简化为 O(len1 * len2)。
2. 空间复杂度
  • dp 数组的大小为 (len1 + 1) x (len2 + 1),因此空间复杂度为 O(len1 * len2)。

综上所述,代码的时间复杂度为 O(len1 * len2),空间复杂度也为 O(len1 * len2)。

五、总结知识点

1. 字符串操作

  • 使用 length() 方法获取字符串的长度。
  • 使用 charAt(index) 方法获取字符串中指定索引处的字符。

2. 动态规划(Dynamic Programming)

  • 使用二维数组 dp 来存储子问题的解,避免重复计算。
  • 定义状态 dp[i][j] 表示 s1 的前 i 个字符和 s2 的前 j 个字符是否能交错组成 s3 的前 i+j 个字符。
  • 状态转移方程基于上一个状态和当前字符的比较。

3. 边界条件处理

  • 检查 s1 和 s2 的长度之和是否等于 s3 的长度,如果不等,直接返回 false
  • 初始化 dp 数组的边界值,即第一行和第一列,这代表了一个字符串为空时的情况。

4. 逻辑运算

  • 使用逻辑与运算符 && 来组合条件表达式。
  • 使用逻辑或运算符 || 在状态转移方程中提供两种可能的转移路径。

5. 循环结构

  • 使用嵌套的 for 循环来遍历 s1 和 s2 的所有可能的前缀组合。

6. 数组操作

  • 创建并初始化二维布尔数组 dp
  • 通过索引访问和更新数组中的元素。

7. 算法设计

  • 使用自底向上的方法来填充动态规划表格,这是一种常见的动态规划策略。

8. 问题求解

  • 将给定的问题分解为更小的子问题,并通过组合子问题的解来求解原问题。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1680985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SketchUp Pro 2024 mac草图大师 激活版 专业的3D建模软件

对于追求专业、高效的设计师们来说&#xff0c;SketchUp Pro 2024 for Mac无疑是最佳的选择。它提供了线条、形状、曲线、文本和图像等多种建模元素&#xff0c;让您能够根据需求自由创作。同时&#xff0c;软件还支持智能标注和尺寸功能&#xff0c;让建模过程更加精确、高效。…

IT行业的现状与未来发展趋势:重塑生活与工作的无限可能

随着科技的飞速发展&#xff0c;IT行业已经逐渐从幕后走到台前&#xff0c;成为推动全球经济和社会发展的核心动力。从云计算的普及、大数据的崛起&#xff0c;到人工智能的爆发&#xff0c;再到物联网、5G通信和区块链技术的日新月异&#xff0c;这些技术不仅正在深刻改变着我…

设计模式与软件体系结构课后练习参考答案

目录 软件设计模式第二章 创建型软件设计模式1. 工厂模式2. 生成器模式3. 单例模式 第三章 结构型软件设计模式1. 组合模式2. 适配器模式3. 外观模式4. 桥接模式 第四章 行为型软件设计模式1. 迭代器模式2. 访问者模式3. 中介者模式4. 策略模式5. 状态模式 案例分析工厂模式案例…

JVM运行时内存整体结构一览

文章目录 Java 虚拟机 (JVM) 运行时内存由程序计时器, 堆, 方法区, 本地方法栈, 虚拟机栈,构成 Java 虚拟机 (JVM) 运行时内存布局主要包括以下几个部分&#xff1a; 程序计数器 (Program Counter Register): 每个线程都有一个程序计数器&#xff0c;它是当前线程执行的字节码…

Axure “情形”的使用

这篇笔记的主要内容是如果在Axure中使用“情形”&#xff0c;对应在我们的研发中就是“判断条件”的使用 Axure情形的使用Axure添加caseAxure的if &#xff0c;sele if 条件判断 条件判断不管是在研发代码中还是实际生活中&#xff0c;无处不在&#xff0c;只是表现形式不同罢…

【C语言】数据类型、常量、变量及运算符

&#x1f31f;博主主页&#xff1a;我是一只海绵派大星 &#x1f4da;专栏分类&#xff1a;嵌入式笔记 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、数据类型 基本数据类型 bool类型 ​char类型 short类型 ​int类型 long类型 浮点类型 二、常量 宏定…

P9748 [CSP-J 2023] 小苹果 / P7071 [CSP-J2020] 优秀的拆分:做题笔记

目录 P9748 [CSP-J 2023] 小苹果 思路 代码 P7071 [CSP-J2020] 优秀的拆分 思路 代码 P9748 [CSP-J 2023] 小苹果 P9748 [CSP-J 2023] 小苹果 思路 先写几个看看规律 题意我们能看出来是三个三个一组的&#xff0c;然后每次取走的都是三个里面的第一个。我们应该很容易…

读人工智能时代与人类未来笔记04_理性时代

1. 理性时代 1.1. 康德在《永久和平论》一文中带着些许的怀疑主义提出&#xff0c;和平可以通过应用达成一致的规则管理独立国家之间的关系来实现 1.2. 理性则借助高等理论物理学的形式&#xff0c;开始进一步探索康德的“自在之物”&#xff0c;并产生…

现代加密技术(对称和非对称加密)

1.分类 现代加密技术&#xff1a;对称和非对称加密&#xff0c;对称加密即共享密钥&#xff0c;非对称加密是公钥加密算法。 2.基础总结 AES是什么算法&#xff1f; 分组加密算法&#xff0c;对称加密算法AES的分组长度是&#xff1f;固定128位AES密钥长度是多少&#xff1f;支…

php+vant van-uploader手机拍照 上传

设置capture”user”&#xff0c;则只会调起摄像头&#xff1b; 不设置capture“user”&#xff0c;则会弹窗让选择相册或拍照。 HTML: <link rel"stylesheet" href"/vue/vant.css"><van-field name"uploader" label"照片"&…

ControlNet原理解析

前排提示照片已经获得小姐姐许可。 光知道ControlNet好用&#xff0c;不想知道它背后的原理么&#xff1f;今天就看一看这篇论文&#xff0c;带大家了解一下ControlNet是如何炼成的。 ControlNet是干嘛的 我们知道现在文本到图像生成很火爆&#xff0c;你只需要输入文字就可以…

framework ‘CoreAudioTypes‘ not found

几天前我升级Xcode15之后遇到了这个问题。关于“CoreAudioTypes”的信息完全是误导。在我的例子中&#xff0c;原因是在删除一些旧代码时&#xff0c;我不小心删除了仍然需要的类。然而&#xff0c;在构建时弹出的唯一消息是关于“CoreAudioTypes”——当我恢复丢失的类时&…

使用python给图片加上文字水印

使用python给图片加上文字水印 作用效果代码 作用 给图片加上文字水印文字水印的字体&#xff0c;颜色&#xff0c;位置可自定义 效果 原图&#xff1a; 加水印后的图&#xff1a; 代码 from PIL import Image, ImageDraw, ImageFontdef add_text_watermark(input_image…

BERT for Joint Intent Classification and Slot Filling 论文阅读

BERT for Joint Intent Classification and Slot Filling 论文阅读 Abstract1 Introduction2 Related work3 Proposed Approach3.1 BERT3.2 Joint Intent Classification and Slot Filling3.3 Conditional Random Field 4 Experiments and Analysis4.1 Data4.2 Training Detail…

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

微软宣布GPT-4o模型,可在 Azure OpenAI上使用

5月14日&#xff0c;微软在官网宣布&#xff0c;OpenAI最新发布的多模态模型GPT-4o&#xff0c;可以在 Azure OpenAI 云服务中使用。 据悉&#xff0c;GPT-4o支持跨文本、视频、音频多模态推理&#xff0c;例如&#xff0c;通过GPT-4o打造一个AI助手&#xff0c;用于辅导孩子解…

AIGC时代已至,你准备好抓住机遇了吗?

一、行业前景 AIGC&#xff0c;即人工智能生成内容&#xff0c;是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步&#xff0c;AIGC已经取得了显著的成果&#xff0c;并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…

界面组件DevExpress WPF v23.2 - 全新升级的数据编辑器、流程图组件

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 DevExpress WPF控件日…

Ubuntu16 扩展磁盘空间

一、扩展容量 关闭虚拟机->硬盘->扩展->输入要扩展的空间大小 二、重新磁盘分区 打开虚拟机&#xff0c;在终端安装gparted&#xff1a; sudo apt-get install gparted 打开gparted&#xff1a; sudo gparted 磁盘分区如下图所示 选择/dev/sda5分区&#xff0c;选择…

平均工资数据分析之回归

链接: R语言实战——中国职工平均工资的变化分析——相关与回归分析 1、模型诊断和评估的方法 1. 残差分析 1、残差图 (Residual Plot)&#xff1a;用于检查残差是否存在非随机模式。理想情况下&#xff0c;残差应随机分布在零附近。 2、Q-Q 图 (Quantile-Quantile Plot)&am…