leetcode97. 交错字符串(算法:动态规划)

news2024/7/5 22:20:26

题目:

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

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

s = s1 + s2 + ... + sn t = t1 + t2 + ... + tm |n - m| <= 1 交错 是 s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ... 注意:a + b 意味着字符串 a 和 b 连接。

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

解题思路:

本题采用动态规划来实现。

1.dp[i][j]表示由s1的前i个字符和s2的前j个字符组成的字符串是否可以交错组成s3的前i+j个字符

2.可分为三种情况:第0行、第0列、其他位置

3.在其他位置时,我们需要考虑的是s3[i+j-1]的字符是来自s1还是s2,所以两种情况都要写出来,满足任意一个即可。

如果s1的第i个字符和s3的第i+j个字符相等,并且s1的前i-1个字符和s2的前j个字符可以交错组成s3前i+j-1个字符,那么s1的前i个字符和s2的前j个字符可以交错组成s3的前i+j个字符;

dp[i-1][j] && (s1[i-1]==s3[i+j-1])

s2的第j个字符也是同理。dp[i][j-1] && (s2[j-1]==s3[i+j-1])
那么,s1和s2其中一个满足,那么dp[i][j]也符合题意,dp[i][j]=1

源代码如下:

class Solution {
public:
    bool isInterleave(string s1, string s2, string s3) {
        int len1=s1.size();//s1的长度
        int len2=s2.size();//s2的长度
        int len3=s3.size();//s3的长度
        //若s1的长度加上s2的长度不等于s3的长度,很显然不能交错组成s3
        if(len1+len2!=len3) return false;
        //定义动态规划数组dp
        //dp[i][j]表示由s1的前i个字符和s2的前j个字符组成的字符串是否可以交错组成s3的前i+j个字符
        vector<vector<int>> dp(len1+1,vector<int>(len2+1));
        dp[0][0]=1;//对dp[0][0]进行初始化
        //先找到s3的起始位置是由哪个字符串组成的
        // 第0列:s1前缀长度i + s2前缀长度0,能否交错组成s3前缀长度i
        for(int i=1;i<=len1;i++)
        {
            if(s1[i-1]==s3[i-1])
            {
                dp[i][0]=dp[i-1][0];
            }
            else
            {
                dp[i][0]=0;
            }
        }
        // 第0行:s1前缀长度0 + s2前缀长度i,能否交错组成s3前缀长度i
        for(int j=1;j<=len2;j++)
        {
            if(s2[j-1]==s3[j-1])
            {
                dp[0][j]=dp[0][j-1];
            }
            else
            {
                dp[0][j]=0;
            }
        }
        
        // 考虑s3的最后一个字符s3[i+j-1]来自s1的第i个字符还是s2的第j个字符
        for(int i=1;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                 // 如果来自s1[i-1],则dp[i][j] 为:s1前缀长度i-1 + s2前缀长度j 能否交错组成s3前缀长度i+j-1,即:dp[i-1][j]
                int flag1=dp[i-1][j]*(s1[i-1]==s3[i+j-1]?1:0);
                // 如果来自s2[j-1],则dp[i][j] 为:s1前缀长度i + s2前缀长度j-1 能否交错组成s3前缀长度i+j-1,即:dp[i][j-1]
                int flag2=dp[i][j-1]*(s2[j-1]==s3[i+j-1]?1:0);
                if(flag1+flag2>0)
                {
                    dp[i][j]=1;
                }
                else
                {
                    dp[i][j]=0;
                }
            }
        }
        //返回结果,dp[len1][len2]为1,则返回true,为0则返回false
        return dp[len1][len2];
    }
};

时间复杂度:O(len1*len2)

空间复杂度:O(len1*len2) 

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

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

相关文章

Spring Batch之读数据库—StoredProcedureItemReader(四十)

一、StoredProcedureItemReader Spring Batch框架对存储过程提供了支持&#xff0c;StoredProcedureItemReader提供了对存储过程的支持&#xff0c;其运行和JdbcCursorItemReader类似&#xff0c;均是获取游标对象&#xff0c;然后转换为JavaBean对象。 StoredProcedureItemRe…

js - 关于ES6 Module模块化的跨域报错

ES6 在语言标准的层面上&#xff0c;实现了模块功能&#xff0c;而且实现得相当简单&#xff0c;旨在成为浏览器和服务器通用的模块解决方案。其模块功能主要由两个命令构成&#xff1a;export或export default和import。export命令用于规定模块的对外接口&#xff0c;import命…

WPF 搜索框控件样式

WPF 搜索框控件样式 完全通过Xaml代码实现&#xff0c;使用了UserControl进行封装。功能包括聚焦时控件展开&#xff0c;输入为空时的文字提示&#xff0c;以及待选提示项列表等效果。实现效果如下图&#xff1a; xaml代码 <UserControl x:Class"SearchBar.SearchBo…

当在IDEA中实现类实现接口时,如果出现红色错误并且无法引入接口类的包,可能是以下几种情况导致的

1.当在IDEA中实现类实现接口时&#xff0c;如果出现红色错误并且无法引入接口类的包&#xff0c;可能是以下几种情况导致的&#xff1a; 2.缺少依赖&#xff1a;首先检查项目的依赖是否正确配置。如果接口类所在的包不在项目的依赖中&#xff0c;IDEA将无法找到该包并引入。可…

nginx系列第八篇:Ubuntu下验证nginx各请求处理阶段

Nginx处理请求的过程一共划分为11个阶段&#xff0c;按照执行顺序依次是 post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-files、content 以及 log。 准备工作&#xff1a;host文件加入测试域名 sudo vi /etc/hosts 加入…

【Java从0到1学习】03 Java 基础知识

1. 关键字 关键字是编程语言里事先定义好并赋予了特殊含义的单词&#xff0c;也称作保留字。和其它语言一样&#xff0c;Java中保留了许多关键字&#xff0c;例如&#xff0c;class、public等&#xff0c;下面列举的是Java中所有的关键字。 1.1 关键字概述 被Java语言赋予特…

VS报错E1696 无法打开类似于stdio.h等头文件的解决办法

VS报错E1696 无法打开类似于stdio.h等头文件的解决办法 我的VS版本是2022的&#xff0c;然后我今天把同事在VS2017上的code&#xff08;一个完整的解决方案&#xff09;从svn上拿过来。结果发现&#xff0c;一大堆E1696的错误。主要表现就是项目中include的一些常用的c语言基础…

【字节缓冲流】定义与使用

字节缓冲流 1.字节缓冲流 BufferOutputStream&#xff1a;该类实现缓冲输出流。通过设置这样的输出流&#xff0c;应用程序可以向底层输出流写入字节&#xff0c;而不必为写入的每个字节导致底层系统的调用BufferInputStream&#xff1a;创建BufferInputStream将创建一个内部…

<Linux开发> linux开发工具-之-I2C TOOLS工具使用

&#xff1c;Linux开发&#xff1e; linux开发工具-之-I2C TOOLS工具使用 &#xff1c;Android开发&#xff1e; Android开发工具- 之-I2C TOOLS工具使用 &#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux I2C 驱动 一 前言 在笔者的另一篇文章 &#xff1c;Android开…

行为树(BEHAVIOR TREES)及其工业应用

顾名思义&#xff0c;行为树是描述事物&#xff08;人&#xff0c;动物&#xff0c;机器人&#xff0c;虚拟角色等等&#xff09;行为的树形结构。游戏行业使用行为树为角色行为建模。现在行为树建模技术正在向其它领域渗透&#xff0c;比如工业产线编排&#xff0c;机器人控制…

UKF无损卡尔曼滤波

摘要——卡尔曼滤波器为估计工程系统的状态提供了一项重要技术。由于非线性卡尔曼滤波器有多种变体&#xff0c;因此缺乏针对特定研究和工程应用的滤波器选择指南。 这就需要深入讨论不同非线性卡尔曼滤波器的复杂性。 实际状态估计应用特别感兴趣的是扩展卡尔曼滤波器 (EKF) 和…

五、DQL-1.概述

一、DQL介绍 Data Query Language 数据查询语言 用来查询数据库中表的记录。 查询关键字&#xff1a;SELECT 二、语法

TortoiseGit 入门指南11:还原与重置

Git 就像个时光机器&#xff0c;能让我们还原到任何提交。 还原未提交的更改 假如我们在查看一个干净的代码仓库&#xff0c;干净意味着工作区中的文件保持着最后一次提交的状态&#xff0c;没有修改。在查看的过程中&#xff0c;我们有意或无意的修改了工作区中的文件&#…

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(4)-Charles如何设置捕获会话

1.简介 前边几篇宏哥介绍了Charles界面内容以及作用。今天宏哥就讲解和分享如何设置Charles后&#xff0c;我们就可以愉快地捕获会话&#xff0c;进行抓包了。因为上一篇许多小伙伴看到宏哥的Charles可以分开看到request和response&#xff0c;而自己的却看不到&#xff0c;因…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描&#xff0c;下面几个关键目录&#xff1a;robots.txt&#xff0c;login.php&#xff0c;admin.php&#xff0c;剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码&#xff0c;在查看l…

23款奔驰S400豪华型升级4D旋转高音,提升车内氛围

奔驰加装4D旋转高音&#xff0c;让高音“有型有色”,高端4D环绕立体声音响系统的视觉效果同样令人印象深刻&#xff1a;系统启动时&#xff0c;安装在前车门后视镜三角板中的两个高音头会与同色车内氛围灯一块亮起&#xff0c;同时向外旋出10mm至最佳效果位置&#xff0c;以提高…

【AutoGluon_01】自动机器学习框架的安装与示例

文章目录 一、安装二、示例一 AutoGluon预测目标数据1、导入数据2、训练3、预测4、评估5、小结 三、示例二 AutoGluon多模态预测&#xff08;Multimodal Prediction&#xff09;1、导入数据2、训练3、预测4、评估 四、示例三 AutoGluon进行时间序列预测1、导入数据2、训练3、预…

【redis】redis管道简述

redis管道可以一次性发送多条命令。 命令示例如下&#xff1a; [xxxlocalhost ~]$ echo -e "set k4 99\nincr k4\nget k4" | nc localhost 6379 \OK :100 $3 100下面先简述一下这条命令的组成&#xff0c;再简述一下管道的常用场景和注意事项。 首先&#xff0c;|是…

跨越山海,爱在滇西|拓数派为滇西孩子点亮科学梦想

近日&#xff0c;拓数派在共青团浙江大学委员会、景东县教育体育局和景东团县委等单位指导下开展“爱在滇西”2023年公益助学活动&#xff0c;并携手浙大国际科创中心、浙大微纳电子学院、启真科技控股公司和北京德恒律所共同向景东浙大求是中学捐赠爱心助学金&#xff0c;用于…

微信小程序的目录解析--【浅入深出系列002】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择先说总目录经常碰到的文件(目录&#xff09;最最常见的目录pages次最常用的就是images 目录 操作起来真正的操作 配套资源 本系列校训 用免费公开视频&#xff0c;卷…