leetcode97. 交错字符串(动态规划-java)

news2024/9/20 20:45:08

交错字符串

  • leetcode97. 交错字符串
    • 题目描述
    • 解题思路
      • 代码演示:
    • 动态规划加状态压缩
      • 代码演示
  • 动态规划专题

leetcode97. 交错字符串

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/interleaving-string

题目描述

给定三个字符串 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

示例 2:
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出:false

示例 3:
输入:s1 = “”, s2 = “”, s3 = “”
输出:true

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

解题思路

首先介绍经典的动态规划的方法。写出来后,再演示空间压缩的方法
s1和上 s2 的长度分别定为 M 和 N。
s3 是由 s1 和 s2 组成的,长度必然是 M +N 不等返回false.
然后生成大小是dp[M + 1][n + 1] 的布尔类型二维数组。
dp[i][j] 代表str1(0 , i - 1) 和 s2 (0,j - 1)能否交错组成s3(0,i + j - 1).
最后返回dp[M][N] 也就是最后的值,
1.两个都是空串时,dp[0][0] = true.都是空 没啥说的了,
2.一个为null 一个不是时,s3 和非null 得保持一直,才是true.
3,一般位置上,分为两种情况,
当前字符和 s1 相等 dp[i - 1][j]
当前字符和 s2 相等,dp[i][j - 1].
两种情况满足一种就是true,否则是false.

代码演示:

 /**
     * 交替字符串 动态规划
     * @param s1
     * @param s2
     * @param s3
     * @return
     */
    public boolean isInterleave(String s1, String s2, String s3) {
        char[] ch1 = s1.toCharArray();
        char[] ch2 = s2.toCharArray();
        char[] aim = s3.toCharArray();
        if (ch2.length + ch1.length != aim.length){
            return false;
        }
        //记录每个位置上是否
        boolean[][] dp = new boolean[ch1.length + 1][ch2.length + 1];
        //0 位置
        dp[0][0] = true;
        //初始化第一行
        for (int i = 1; i <= ch1.length;i++){
            if (ch1[i- 1]  != aim[i - 1]){
                break;
            }
            dp[i][0] = true;
        }
        //初始化第一列
        for (int j = 1;j <= ch2.length;j++){
            if (ch2[j - 1] != aim[j - 1]){
                break;
            }
            dp[0][j] = true;
        }
        //一般位置
        for (int i = 1; i <= ch1.length;i++){
            for (int j = 1;j <= ch2.length;j++){
                //aim 所在位置 i + j - 1;
                //和s1 相等时
                boolean p1 = (ch1[i - 1] == aim[i + j - 1]) && dp[i - 1][j];
                //和s2 相等时
                boolean p2 = (ch2[j - 1] == aim[i + j - 1]) && dp[i][j - 1];
                dp[i][j] = p1 || p2;
            }
        }
        return dp[ch1.length][ch2.length];
    }

动态规划加状态压缩

dp[i][j] 依赖 dp[i - 1][j ] 和 dp[i ][j - 1 ] 两个位置,相邻位置,所以可以把二维数组压缩成一维数组,从左向右,上到下滚动更新,
如图演示:
在这里插入图片描述
五角星位置依赖两个三角位置,所以这种事可以使用状态压缩得。

代码演示

 /**
     * 动态规划  状态压缩
     * @param s1
     * @param s2
     * @param s3
     * @return
     */
    public boolean isInterleave1(String s1, String s2, String s3) {
        char[] ch1 = s1.toCharArray();
        char[] ch2 = s2.toCharArray();
        char[] aim = s3.toCharArray();
        if (ch2.length + ch1.length != aim.length){
            return false;
        }
        //记录每个位置上是否
        boolean[] dp = new boolean[ch2.length + 1];
        dp[0] = true;

        //初始化下一行
        for (int j = 1;j <= ch2.length;j++){
            if (ch2[j - 1] != aim[j - 1]){
                break;
            }
            dp[j] = true;
        }

        for (int i = 1; i <= ch1.length;i++){
            //滚动更新下一行最左边得值
            dp[0] = dp[0] && ch1[i - 1] == aim[i - 1];
            for (int j = 1;j <= ch2.length;j++){
                //aim 的长度 i + j - 1;
                boolean p1 = (ch1[i - 1] == aim[i + j - 1]) && dp[j];
                boolean p2 = (ch2[j - 1] == aim[i + j - 1]) && dp[j - 1];
                if (p1 || p2){
                    dp[j] = true;
                }else{
                    dp[j] = false;
                }
            }
        }
        return dp[ch2.length];
    }

动态规划专题

leetcode72. 编辑距离

leetcode1884. 鸡蛋掉落-两枚鸡蛋

leetcode887. 鸡蛋掉落

leetcode514. 自由之路

leetcode583. 两个字符串的删除操作

leetcode474. 一和零

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

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

相关文章

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念&#xff0c;用于描述矩阵的行&#xff08;或列&#xff09;向量的线性无关程度。矩阵的秩可以通过…

chatgpt赋能python:Python遍历0到100的使用场景及方法

Python遍历0到100的使用场景及方法 Python是一种简洁、高效的脚本语言&#xff0c;广泛用于各种领域的开发。本文介绍Python遍历0到100的使用场景以及方法&#xff0c;旨在帮助读者更加了解Python的强大之处。 遍历0到100的背景和意义 遍历0到100是一种常见的问题&#xff0…

网络安全合规-银行业数据治理架构体系搭建(一)

为引导银行业金融机构加强数据治理&#xff0c;充分发挥数据价值&#xff0c;全面向高质量发展转变&#xff0c;银监会于2018年发布了《银行业金融机构数据治理指引》&#xff0c;主要内容如下&#xff1a; 近年来银行业金融机构在业务快速发展过程中&#xff0c;积累了客户数…

JavaScript 手写代码 第六期(重写数组方法三) 用于遍历的方法

文章目录 1. 为什么要手写代码&#xff1f;2. 手写代码2.1 forEach2.1.1 基本使用2.1.2 手写实现 2.2 map2.2.1 基本使用2.2.2 手写实现 2.3 filter2.3.1 基本使用2.3.2 手写实现 2.4 every2.4.1 基本使用2.4.2 手写实现 2.5 some2.5.1 基本使用2.5.2 手写实现 2.6 reduce2.6.1…

虚幻引擎(UE5)-大世界分区WorldPartition教程(二)

文章目录 前言一、OFPA怎么用二、OFPA怎么用总结 上一篇&#xff1a;虚幻引擎(UE5)-大世界分区WorldPartition教程(一) 前言 在UE4版本中中&#xff0c;Actor是保存在关卡文件中的&#xff0c;也就是说&#xff0c;如果要编辑关卡中的某些Actor&#xff0c;需要签出关卡文件进…

STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习2(AD多通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

SNMP 计算机网络管理 实验2(二) SNMP服务与常用网管命令之任务三:对同学的计算机进行网络管理 任务四:查询计算机网卡的相关信息

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

Windows下通过FastGithub加速国内GitHub访问

有时候在国内访问GitHub会非常慢&#xff0c;有时候直接打不开&#xff0c;无法访问&#xff0c;最近了解到了FastGithub 可以解决以下几个问题: github加速神器&#xff0c;解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问…

刷题第二天 数组 leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&…

Use ELK with Django Log

What is ELK? The ELK Stack is a collection of three open source products: ElasticsearchLogstashKibana When to use ELK? ELK is designed to allow us to take data from any source, in any format, and to search, analyze, visualize data in real time. At t…

Java Swing编写批量模糊替换jar包小工具

用途&#xff1a;由于jar包升级需要对之前jar包进行替换&#xff0c;而版本后缀不一致需要人工手动比对 作用&#xff1a;代码升级后&#xff0c;同一个模块jar包相同只有后缀不同&#xff0c;编写小工具进行比对进行替换名称&#xff0c;避免人工核对 技术点&#xff1a;Java …

快来看看Java在编程语言中的优势与特性吧

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 其他专栏&#xff1a;《系统解析C语言》《C语言》《C语言-语法篇》 内容分享&#xff1a…

iview ui vue2.0 radio 点击选中状态后取消选中状态

<RadioGroup v-model"formData.deficiencyType"><Radio label"1" :disabled"modalTypeC?true:false" click.native"cancelSelection(1)">1</Radio><Radio label"2" :disabled"modalTypeC?tru…

基于Java校园自助洗衣系设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

MIT6.584分布式-原MIT6.824-lab1-2023年万字从0到1小白学习笔记

文章目录 前置准备一、分布式系统知识的学习1.1分布式Go语言环境安装1.2MIT6.824课程的学习1.2* 前言学习 可以看到这个任务是不会完成的&#xff0c;在我们没有开始进行编码的时候1.3课程需求1.4怎么实现、借助课程的Hints1.5首先看看其mapfunction的工作逻辑&#xff1a; 二、…

2023上半年软考系统分析师科目一整理-09

2023上半年软考系统分析师科目一整理-09 IDEF (Integration DEFinition method &#xff0c;集成定义方法)是一系列建模、分析和仿真方法的统称&#xff0c;每套方法都是通过建模来获得某种特定类型的信息。其中&#xff0c; IDEFO 可以进行&#xff08;C&#xff09;建模; IDE…

互联网大厂技术-HTTP请求-Springboot整合Feign更优雅地实现Http服务调用

目录 一、SpringBoot快速整合Feign 1.添加Pom依赖 2.启动类添加注解 3.引用Feign服务 二、为请求添加Header的3种方式 1.添加固定header 2.通过接口签名添加header 3.动态添加header 三、为请求添加超时配置 1.默认超时时间 3.超时异常 4.全局超时配置 5.为单个服…

Linux:安装jdk

一、tar压缩包形式安装jdk&#xff1a; 1、安装到/opt目录下&#xff0c;如下图所示&#xff0c;先将tar.gz压缩包移动到/opt目录下&#xff0c;然后解压出来&#xff0c;命令依次是&#xff1a; tar -zxvf jdk-8u151-linux-x64.tar.gz 2、解压缩完毕后&#xff0c;我们使用ls命…

ArrayList继承了AbstractList,已经间接实现了List接口,那么为什么ArrayList还要显式实现List接口呢

这是因为,通过显式实现接口,ArrayList可以确保: 它实际上已经完整实现了List接口所规定的所有方法。 更明确地告诉其他程序员:这个类的目的是完整实现List接口。 如果ArrayList仅仅继承AbstractList,而未显式实现List接口,那么其他程序员在阅读代码时,无法立即确定这个类是否完…

STM32单片机(三)第二节:GPIO输出练习3(蜂鸣器)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…