力扣--动态规划97.交错字符串

思路分析:

  1. 动态规划数组定义

    • dp[i][j] 表示:使用字符串 s1 的前 i 个字符和字符串 s2 的前 j 个字符,能否构成字符串 s3 的前 i + j 个字符的交错组合。
  2. 初始化

    • dp[0][0] 初始化为 1,表示空串是 s1s2 的交错组成。
    • 初始化第一行和第一列,检查 s1s2 的前缀是否与 s3 的对应前缀相等,若相等则标记为 1
  3. 递推关系

    • dp[i][j] 的值取决于 s1[i-1]s2[j-1]s3[i+j-1] 是否匹配,以及之前的状态:
      • 如果 s3[i+j-1] == s1[i-1]dp[i-1][j] == 1,表示当前字符匹配且前缀也能交错组成,标记 dp[i][j] = 1
      • 如果 s3[i+j-1] == s2[j-1]dp[i][j-1] == 1,表示当前字符匹配且前缀也能交错组成,标记 dp[i][j] = 1
  4. 最终结果

    • dp[len1][len2] 的值将告诉我们整个字符串 s3 是否可以由 s1s2 交错组成。
  5. 返回结果

    • 返回 dp[len1][len2]
class Solution {
public:
    // 判断字符串 s3 是否是由字符串 s1 和 s2 交错组成的
    bool isInterleave(string s1, string s2, string s3) {
        // 获取字符串 s1、s2、s3 的长度
        int len1 = s1.length();
        int len2 = s2.length();
        int len3 = s3.length();

        // 如果 s1 和 s2 的长度之和不等于 s3 的长度,直接返回 false
        if (len1 + len2 != len3)
            return false;

        // 处理特殊情况:当 s1 为空时,判断 s2 和 s3 是否相等;当 s2 为空时,判断 s1 和 s3 是否相等
        if (len1 == 0 && s2 == s3)
            return true;
        if (len2 == 0 && s1 == s3)
            return true;

        // 创建二维数组 dp,用于记录 s1 和 s2 是否能够交错组成 s3 的子串
        vector<vector<int>> dp(len1 + 1, vector<int>(len2 + 1, 0));

        // 初始化 dp[0][0] 为 1,表示空串是 s1 和 s2 的交错组成
        dp[0][0] = 1;

        // 初始化第一行,如果 s1 的前缀和 s3 相等,标记 dp[i][0] 为 1
        for (int i = 1; i <= len1; ++i) {
            if (s1[i - 1] == s3[i - 1])
                dp[i][0] = 1;
            else
                break;
        }

        // 初始化第一列,如果 s2 的前缀和 s3 相等,标记 dp[0][j] 为 1
        for (int i = 1; i <= len2; ++i) {
            if (s2[i - 1] == s3[i - 1])
                dp[0][i] = 1;
            else
                break;
        }

        // 动态规划,填充 dp 数组
        for (int i = 1; i <= len1; ++i) {
            for (int j = 1; j <= len2; ++j) {
                // 如果 s3 的当前字符等于 s1 的当前字符,并且 s1 的前缀也能够组成 s3 的前缀,则标记 dp[i][j] 为 1
                if (s3[i + j - 1] == s1[i - 1] && dp[i - 1][j])
                    dp[i][j] = 1;
                // 如果 s3 的当前字符等于 s2 的当前字符,并且 s2 的前缀也能够组成 s3 的前缀,则标记 dp[i][j] 为 1
                if (s3[i + j - 1] == s2[j - 1] && dp[i][j - 1])
                    dp[i][j] = 1;
            }
        }

        // 返回 dp 数组右下角的值,表示整个 s3 是否由 s1 和 s2 交错组成
        return dp[len1][len2];
    }
};

这个还是很抽象难理解,这里举个例子:
 

假设我们有两个字符串 s1 = "abc"s2 = "def",以及 s3 = "adbcef"。我们想要判断是否可以通过交错组合 s1s2 得到 s3

我们可以用一个二维数组 dp[i][j] 来表示 s1 的前 i 个字符和 s2 的前 j 个字符是否可以组成 s3 的前 i+j 个字符。

  1. 初始化

    • dp[0][0] 初始化为 1,因为空串是任何字符串的子串,所以空串可以由 s1s2 交错组成。
    • 初始化第一行和第一列,检查 s1s2 的前缀是否能够交错组成 s3 的前缀

    dp array:
      d e f
     1 0 0 0
    a 1 0 0 0
    b 0 0 0 0
    c 0 0 0 0

  2. 递推关系

    • 我们递推地填充 dp 数组。在这个过程中,如果当前字符匹配,我们要考虑之前的状态是否可行。
    • 对于 dp[i][j],如果 s3[i+j-1]s1[i-1] 匹配,并且 dp[i-1][j]1,那么 dp[i][j] 也可以为 1。同样,如果 s3[i+j-1]s2[j-1] 匹配,并且 dp[i][j-1]1,那么 dp[i][j] 也可以为 1。

    dp array:
      d e f
     1 0 0 0
    a 1 1 1 0
    b 0 1 0 0
    c 0 0 1 0

  3. 最终结果

    • 最终的 dp[len1][len2]1,表示整个字符串 s3 可以由 s1s2 交错组成。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯练习系统(算法训练)ALGO-980 斐波那契串

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;10.0s Java时间限制&#xff1a;30.0s Python时间限制&#xff1a;50.0s 问题描述 斐波那契串由下列规则生成&#xff1a;   F[0] "0";   F[1] "1";   F[n] F[n-1] F[n-2]…

2024年最新《国际预警期刊》正式更新!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、国际期刊预警名单的变化&#xff1f;二、课程案例展示&#xff08;篇幅有限仅展示部分&#xff09;1.【热图系列】2.【九象限图系列】3.【富集分析系列】4.【机…

Redis哨兵模式(Sentinel)的搭建与配置

创建三个Redis实例所需的目录,生产环境需独立部署在不同主机上,提高稳定性。 Redis 哨兵模式(Sentinel)是一个自动监控处理 redis 间故障节点转移工作的一个redis服务端实例,它不提供数据存储服务,只进行普通 redis 节点监控管理,使用redis哨兵模式可以实现redis服务端故…

压缩自定义格式压缩包<2>:python使用DEFLATE 算法打包并解压成功,但是解压后的文件格式是固定后缀。

打包 import zlib import osdef compress_folder(input_folder, output_filename):"""使用 DEFLATE 算法压缩文件夹下的所有文件。Parameters:input_folder: str要压缩的文件夹路径。output_filename: str输出压缩文件名。"""# 创建一个空的字节…

数据结构绪论

数据元素&#xff1b;数据项&#xff1b;组合项 数据对象 有相同性质的数据元素就属于同一个数据对象&#xff1b; 而数据结构则要求数据元素之间存在特定的关系&#xff01; 线性数据结构&网状数据结构 数据结构这门课关注的是数据元素之间的关系&#xff0c;和对这些…

做抖音小店需要交钱吗?有门槛吗?都有哪些入驻条件和费用?

大家好&#xff0c;我是电商花花。 在抖音上开店已经成为很多人追逐的方向&#xff0c;因为这些人都看到别人在抖音上赚到钱&#xff0c;然后也想在抖音上尝试一下。 然而&#xff0c;许多人心中仍然存着一个问题&#xff0c;就是做抖音小店需要交钱吗&#xff1f;是否存在门…

盛元广通粮油质量检测实验室管理系统

近年来对于食品安全问题层出不穷&#xff0c;为提高粮食检测中心管理水平&#xff0c;关系到千千万万的消费者的健康饮食问题&#xff0c;粮油作为老百姓日常生活饮食必需品、消耗品&#xff0c;需从源头上对粮食在本省&#xff08;区、市、县&#xff09;不同粮食品种检测检测…

WorkPlus Meet提供高效、安全视频会议解决方案

WorkPlus Meet是一款私有部署和定制化的视频会议解决方案&#xff0c;为企业提供高效、安全的远程协作平台。随着全球数字化转型的加速&#xff0c;视频会议已成为企业必不可少的工作工具&#xff0c;而WorkPlus Meet的私有部署和定制化功能&#xff0c;为企业提供了更大的控制…

KIF本地密钥注入验证步骤 RSA加解密 python JAVA

**验证步骤&#xff1a;** # 终端随机生成一对RSA key pair pem文件 # 终端把sn及公钥发过去 # KIF返回公钥加密后的IPEK及明文IPEK的KCV &#xff08;加密机处理加密等操作&#xff1a;把sn和Base Derivation Key分散生成IPEK用加密机的Local Master Key存入加密机&#xff0c…

面试官:说说你对事件循环的理解

一、事件循环是什么 首先&#xff0c;JavaScript是一门单线程的语言&#xff0c;意味着同一时间内只能做一件事&#xff0c;但是这并不意味着单线程就是阻塞&#xff0c;而实现单线程非阻塞的方法就是事件循环 在JavaScript中&#xff0c;所有的任务都可以分为 同步任务&#…

鸿蒙操作系统 HarmonyOS 3.2 API 9 Stage模型通过ArkTS接入高德地图

用鸿蒙ArkTS语言开发地图APP应用时&#xff0c;很多地图厂商只接入了鸿蒙Java&#xff0c;ArkTS版本陆续接入中&#xff0c;等一段时间才能面世&#xff0c;当前使用地图只能通过鸿蒙的Web组件&#xff0c;将HTML页面嵌入到鸿蒙APP中。具体方法如下&#xff1a;编写HTML <!…

STM32寄存器总结

stm32f10x.h AFIO AFIO->MAPR |= (0<<26)|(1<<25)|(0<<24)|(1<<5)|(1<<4)|(1<<3)|(1<<2)|(1<<0); 复用重映射和调试I/O配置寄存器(AFIO_MAPR) 地址偏移:0x04 复位值:0x0000 0000 第24-26位: 设置值:010 说明: …

初学Vue——打包部署Vue前端静态资源

0 引言 我们的前端工程开发好了&#xff0c;但是我们需要发布&#xff0c;那么如何发布呢&#xff1f;主要分为2步&#xff1a; 前端工程打包 通过nginx服务器发布前端工程 在完成Vue项目后&#xff0c;我们需要将项目部署到服务器中&#xff0c;才能够在互联网中访问。这里…

do while循环、嵌套循环、数组简介

本文参考C Primer Plus进行学习 文章目录 出口循环条件&#xff1a;do while如何选择循环嵌套循环数组简介 在for循环中使用数组 一.出口循环条件&#xff1a;do while 出口循环条件&#xff0c;即在循环的每次迭代之后检查测试条件&#xff0c;这保证了至少执行循环体中的内容…

《互联网的世界》第六讲-去中心化和安全

互联网构建于开放互联的中立原则之上&#xff0c;公平接入&#xff0c;数据互联互通&#xff0c;流量被无差别对待&#xff0c;这意味着互联网本质上是匿名&#xff0c;去中心的&#xff0c;这与我们的现实世界完全不同。 但互联网上的主流业务却是 c/s 产销模式&#xff0c;试…

【教程】APP备案全攻略:确保你的应用合规上线

【教程】APP备案全攻略&#xff1a;确保你的应用合规上线 摘要 本文详细介绍了中国大陆地区互联网信息服务提供者&#xff08;AP&#xff09;进行APP备案的流程、要求和注意事项。包括备案对象、备案方式、备案内容、备案流程等方面的详细说明&#xff0c;帮助开发者顺利完成…

sensitive-word 敏感词 违规文字检测

1、快速开始 - JDK1.7- Maven 3.x 2、Maven 引入 <!-- https://mvnrepository.com/artifact/com.github.houbb/sensitive-word --><dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version…

基于PLC除尘设备控制系统的设计

摘要 工业作为我国第二支柱产业&#xff0c;在近十几年来发展非常迅速&#xff0c;虽然带了了可观的经济效益&#xff0c;但在工业生产中所产生的大量粉尘气体对大气的污染现象也不容忽视。为减少工业粉尘对环境的污染&#xff0c;世界各国制定了严格的环境保护要求。为了减少…

金山办公内推

作为金山办公刚刚校招等待入职的一员&#xff0c;我诚挚地邀请您加入我的内推计划&#xff0c;与我一起共同打造卓越的工作环境和未来。 我能帮你 &#xff08;与直接填我的内推码不同&#xff0c;我直接通过内部问卷帮你投&#xff09; 1&#xff0c;直接通过校招群里的连接…

异步编程和asyncio

介绍异步编程的重要性和在Python中的应用&#xff0c;特别是在I/O密集型任务和网络编程场景下。 目录 理解异步编程 异步编程基本概念 任务与Future 异步编程的工作原理 事件循环 协程&#xff08;Coroutines&#xff09; 异步与同步代码的结合 深入asyncio模块 事件循…