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

一、题目描述

给定三个字符串 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.hqwc.cn/news/706026.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本&#xff1a;22.04.3 位数&#xff1a;64-bit 二…

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal&#xff1a;S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

微服架构基础设施环境平台搭建 -(七)Kubesphere pod内安装vimping命令

微服架构基础设施环境平台搭建 -&#xff08;七&#xff09;Kubesphere pod安装vim&ping命令 在K8s集群运维过程&#xff0c;需要进入pod容器内通过ping来测试网络是否通畅&#xff0c;或使用vim进行编辑文件&#xff0c;但是pod容器默认情况下是不支持ping、vim命令的&…

绝地求生:PGS3参赛队伍跳点一览,17压力有点大,4AM与PeRo大概率不roll点

在PCL春季赛结束后&#xff0c;PGS3的参赛队伍名单以及分组就正式确定了&#xff0c;最后确定名额的DDT和NH被安排在了A组和B组&#xff0c;感觉这次PGS3的分组比较均衡&#xff0c;没有“死亡之组”一说。这段时间已经有网友汇总了PGS3队伍在各个地图的跳点&#xff0c;并且把…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

AMD W7900本地大型语言模型的微调

GenAI-contest/01-LLM_Fine-tuning at main amd/GenAI-contest (github.com) 大型语言模型&#xff08;LLMs&#xff09;在大量的文本数据上进行训练。因此&#xff0c;它们能够生成连贯且流畅的文本。Transformer架构是所有LLMs的基础构建块&#xff0c;它作为底层架构&…

Vue和Django前后端实现跨域

1.为什么要解决跨域&#xff1a; 前端与后端分处不同的域名&#xff0c;因为客户端访问不同源的服务端时会遭到浏览器的同源策略的拦截&#xff0c;所以我们需要配置CORS&#xff0c;处理的方式有很多&#xff0c;先来说下自己学习到的。 2.前端处理跨域&#xff1a; 前端项目是…

我21岁玩“撸货”,被骗1000多万

最近&#xff0c;撸货业界内发生了一些颇受瞩目的事件。 在郑州&#xff0c;数码档口下面抢手团长跑路失联&#xff0c;涉及金额几百万&#xff0c;在南京&#xff0c;一家知名的电商平台下的收货站点突然失联&#xff0c;涉及金额高达一千多万&#xff0c;令众多交易者震惊不已…

电机控制系列模块解析(20)—— MTPA

一、MTPA MTPA 是 "Maximum Torque Per Ampere" 的缩写&#xff0c;意为“最大转矩电流比”。在电机控制系统中&#xff0c;特别是永磁同步电机&#xff08;PMSM&#xff09;或其它永磁电机的控制策略中&#xff0c;MTPA 控制旨在实现电机在给定负载条件下&#xff…

2005-2022年全国及各省绿色信贷水平测算数据(含原始数据+计算过程+计算结果)

2005-2022年全国及各省绿色信贷水平测算数据&#xff08;含原始数据计算过程计算结果&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;工业统计年鉴、统计年鉴、其中2017年采用插值法填补 3、范围&#xff1a;31省 4、方法说明&#xff1a;选取各省六大高…

汇中 SCL-61D2超声水表汇中通讯协议

RS-485串行通讯接口设置表 通用代码注释 读取正向仪表数据 DD的内容为 通讯示例 主机命令&#xff1a;2A 41 4A 仪表响应&#xff1a;26 41 4A 00 00 13 63 00 00 07 72 00 00 10 34 00 33 读取负向仪表数据&#xff1a;&#xff08;单向型仪表无此命令&#xff09; DD的内容…

【每日力扣】207. 课程表 与 208. 实现 Trie (前缀树)

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 207. 课程表 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课…