Leetcode 97. 交错字符串

leetcode — 97. 交错字符串 给定三个字符串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意味着字符... 阅读详情

题目

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

示例 1:

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

示例 2:

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

解答

解法一:递归

代码很容易理解。

主要思想是:s3 当前位置的字符要么来自 s1 , 要么来自 s2 。

递归代码有很多重复运算,必然会导致超时 TLE 。

代码
class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s3.length() != s1.length() + s2.length()) return false;
        if(s3.isEmpty()) return true;
        
        char first = s3.charAt(0);
        if(!s1.isEmpty() && first == s1.charAt(0)) {
            if(isInterleave(s1.substring(1), s2, s3.substring(1))) return true;
        }
        
        if(!s2.isEmpty() && first == s2.charAt(0)) {
            if(isInterleave(s1, s2.substring(1), s3.substring(1))) return true;
        }
        
        return false;
    }
}
结果

在这里插入图片描述

使用记忆化搜索可以去掉大量重复的计算。

记忆化搜索代码
class Solution {
    
    // memo[i][j] 表示:s3[0 .. i + j - 1] 是否 s1[0 ... i - 1] 与 s2[0 ... j - 1] 的交错串
    private Boolean[][] memo;
    public boolean isInterleave(String s1, String s2, String s3) {
        memo = new Boolean[s1.length() + 1][s2.length() + 1];
        return isInterleave(s1.toCharArray(), s1.length(), s2.toCharArray(), s2.length(), s3.toCharArray(), s3.length());
    }
    
    private boolean isInterleave(char[] w1, int i, char[] w2, int j, char[] w3, int k) {
        if(memo[i][j] != null) return memo[i][j];
        
        boolean ret = false;
        if(k != i + j) {
            ret = false;
        } else if(k == 0) {
            ret = true;
        } else {
            if(i != 0 && w1[i - 1] == w3[k - 1] && isInterleave(w1, i - 1, w2, j, w3, k - 1)) ret = true;
            if(j != 0 && w2[j - 1] == w3[k - 1] && isInterleave(w1, i, w2, j - 1, w3, k - 1)) ret = true;
        }
        
        memo[i][j] = ret;
        return ret;
    }
}
结果

在这里插入图片描述

解法二:动态规划

动态规划四要素:

  1. 状态定义:dp[i][j] 表示 s1[0 … i - 1] 与 s2[0 … j - 1] 是否能形成交错字符串 s3[0 … i + j - 1]。

  2. 状态转移:dp[i][j] = (dp[i - 1][j] && s1 与 s3 当前字符是否匹配) || (dp[i][j - 1] && s2 与 s3 当前字符是否匹配);

  3. 状态初始化:dp[0][0] = true 。

  4. 结果:dp[s1.length()][s2.length()]

复杂度:O(nm) 时间,O(nm) 空间。(tips:空间可以优化)

代码
public class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if (s3.length() != s1.length() + s2.length()) return false;
        
        boolean dp[][] = new boolean[s1.length() + 1][s2.length() + 1];
        for (int i = 0; i <= s1.length(); i ++) {
            for (int j = 0; j <= s2.length(); j ++) {
                if (i == 0 && j == 0) {
                    dp[i][j] = true;
                } else if (i == 0) {
                    dp[i][j] = dp[i][j - 1] && s2.charAt(j - 1) == s3.charAt(i + j - 1);
                } else if (j == 0) {
                    dp[i][j] = dp[i - 1][j] && s1.charAt(i - 1) == s3.charAt(i + j - 1);
                } else {
                    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[s1.length()][s2.length()];
    }
}

结果

在这里插入图片描述

【中等】力扣算法题解析LeetCode97:交错字符串 本文解决字符串交错匹配问题,验证字符串 s3 是否由 s1 和 s2 交错组成。通过动态规划优化空间至 O(s2.length),步骤如下: 长度检查:若 s1 和 s2 长度之和不等于 s3,直接返回 false。 动态规划数组:使用一维数组 dp,dp[j] 表示 s1 前 i 个字符和 s2 前 j 个字符能否匹配 s3 前 i+j 个字符。 初始化:dp[0] = true,并初始化 s1 为空时 s2 与 s3 的匹配情况。 状态转移:遍历 s1 和 s2,更新 dp[j] 为....... 阅读详情

相关推荐

[官方培训]22-UE资产优化 Epic 肖月 笔记

Nanite+Lumen目标:面向TA,美术,不影响视觉的前提下,优化运行和编辑效率引擎:UE5.1延迟管线平台:主流PC,Windows 10 with DX12。

Tcohneyn的博客 1574

LeetCode刷题总结--DFS与字符串处理

388. Longest Absolute File Path "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"则个字符串序列是由文件目录树的深度优先搜索(先根遍历)得到的,所以需要借助栈来进行解析这个字符串得到所有全路径,从而比较全路径字符串的长度。这里要注意的是...

To_be_thinking的博客 615

Petalinux 2021.1 + Vivado 2021 实战:手把手教你为Zynq板卡移植Linux并搞定AXI DMA驱动

本文详细介绍了基于Petalinux 2021.1和Vivado 2021工具链,为Zynq开发板移植Linux系统并开发AXI DMA驱动的全流程。从环境配置、硬件设计到驱动适配与性能优化,提供了实战避坑技巧和版本特异性问题的解决方案,帮助开发者快速构建高速数据传输系统。

weixin_42641741的博客 386

StringUtil 字符串处理工具

一个字符串处理的工具类(●’◡’●) 包含以下功能: 判断应用程序是否安装 字符拆分成数组 MD5 加密 拼接后的字符串 替换字符串 判断多个参数是否都为空 将字符串转换成HTML格式的字符串 将HTML格式的字符串转换成常规显示的字符串 获取加密的手机号 检查手机号 验证固定电话号码 检查密码有效 根据string.xml资源格式化字符串 验证身份证号码 将元单位数字转成int类型的元 格式化...

夏安的博客 1102

机械臂抓取前言

机械臂相关的笔记

weixin_64037619的博客 3908

ESP32搭配FT6236触摸屏:从芯片手册到完整I2C驱动代码的保姆级解析

本文详细解析了ESP32搭配FT6236触摸屏的I2C驱动开发过程,从芯片手册解读到完整代码实现。通过硬件架构分析、寄存器配置、I2C通信封装及触摸数据处理等步骤,提供了一套完整的驱动解决方案,帮助开发者快速掌握ESP32与触摸屏的交互技术。

weixin_29174385的博客 291

逻辑布尔表达式(增加计算前公式语法校验)

业务场景需要实现一个公式计算器,经过提炼成oj 题目如下: 给定一个只包括 ‘(’,’)’,’&’,’|’,‘1’,‘0’ 的字符串 s ,计算该表达式的布尔结果 注意: 其中 多重 ‘(’,’)’ 需要有计算优先级,先计算括号内部运算 ‘&’ => 且 ‘|’ => 或 ‘1’ => true ‘0’ => false 返回结果数据类: class CalculateResult{ public Boolean checkResult; public Boolean

Ru_yin_hai的博客 1017

AI Agent在保险行业落地:从智能客服到核保理赔的实践路径

AI Agent作为大模型技术的核心应用形态,正从通用对话走向垂直行业深度落地。其本质是让机器理解自然语言、处理非结构化文档,并在复杂业务流程中辅助人类完成信息抽取、内容生成与多轮交互。在保险这一强监管、高客单价的行业中,智能客服与销售助手率先验证了降本增效的价值,核保与理赔环节则进一步展示了AI在文档理解与风控辅助上的高价值潜力。从技术原理到商业闭环,垂直场景正在成为AI应用的主战场。本文以保险行业为样本,剖析AI Agent如何嵌入真实业务流程,梳理可复用的三阶段落地路径,为企业在医疗、金融等类似高文本

weixin_29039773的博客 363

字符串转int整型,parseInt底层实现,String类下的charAt()方法,字符串转换成指定类型的一个数值parseXXX(),XXXvalue,valueof,character常用类

包装类字符串转成int类型有三种方式:但是底层全部都调用了parseInt()方法。 字符串转int整型代码如下: 包装类字符串转整型的三种方式如下: parseInt内部底层实现:先比较要转的字符是否为空,然后判断进制radix是否在最小进制2到最大进制36之间,如果格式不正确返回异常(数据格式异常)NumberFormatException String类下的charAt(index)方法 charAt方法可以定位一个String类型变量的某个索引单元的元素,括号内的参数是String类型变量的索

qq_43363066的博客 891

【RT-DETR涨点改进】小目标检测、特征融合改进篇 | TGRS 2024 | RT-DETR引入CSFM上下文选择融合模块,适合多模态检测、红外小目标检测、小目标检测、遥感目标检测等任务有效涨点

本文提出了一种改进RT-DETR目标检测模型的方法,通过引入上下文选择融合模块(CSFM)显著提升复杂背景下小目标和低对比度目标的检测精度。CSFM模块采用多尺度特征融合和动态特征选择机制,有效增强模型的全局上下文感知能力,同时保留细节特征。该模块通过通道减少机制和空间信息调节,实现从粗到细的特征聚合,减少误报并提高轮廓检测精度。实验表明,改进后的RT-DETR模型在多个基准测试中表现优异,计算效率与检测精度均优于现有方法。文章还详细介绍了模块配置和yaml文件修改方法,为模型部署提供指导。

Ai缝合怪、助力小伙伴高效发论文 1723

【STM32系统及仿真】基于STM32+蓝牙设计的智能窗帘系统__资料编号8

本项目设计并实现了一种基于STM32单片机的智能窗帘系统,集成了光敏传感器、温湿度传感器、蓝牙模块和OLED显示屏,实现了窗帘的自动调节、环境监测和远程控制功能。系统采用STM32F103C8T6作为主控制器,通过光敏传感器检测环境光强,温湿度传感器监测室内环境,蓝牙模块实现与手机APP的通信,用户可以通过APP远程控制窗帘的开合状态。系统在检测到环境光照强度或温度超出设定范围时,可自动调节窗帘的开合,以达到节能和提高舒适度的目的。

嵌入式阿齐Archie 2万+

逻辑布尔运算器

业务场景需要实现一个公式计算器,经过提炼成oj 题目如下: 给定一个只包括 ‘(’,’)’,’&’,’|’,‘1’,‘0’ 的字符串 s ,计算该表达式的布尔结果 注意: 其中 多重 ‘(’,’)’ 需要有计算优先级,先计算括号内部运算 ‘&’ => 并 ‘|’ => 或 ‘1’ => true ‘0’ => false 示例 1: 输入:s = "1" 输出:true 示例 2: 输入:s = "((1&1|1&0|1)|(1&1))" 输

Ru_yin_hai的博客 1951

调节桌面图标大小的方法(编程)

如果你对其他操作系统或编程语言有类似的需求,可以根据具体的情况进行相应的调整和搜索相关的库和方法。在编程中,我们可以使用各种桌面应用程序来调节桌面图标的大小。库提供的函数,我们获取了桌面图标的窗口句柄,并使用Windows消息发送方式设置图标的大小。你可以根据自己的需求修改代码中的图标大小值,并在运行代码后观察桌面图标的变化。函数并传入所需的图标大小,这里设置为48x48像素。首先,我们需要使用Python的第三现的方法。首先,我们需要使用Python的第三方库。首先,我们需要使用实现的方法。

CyberFlare的博客 438

C/C++描述 LeetCode97. 交错字符串

C/C++描述 LeetCode97. 交错字符串   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 题目 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcb

一起加油 2073

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

力扣第97题 - 交错字符串

给定三个字符串 、 和 ,判断 是否可以由 和 按某种顺序交错组成。这是一个经典的 动态规划 问题。我们需要判断是否可以通过选择 或 的字符,交错拼接出 。定义状态:状态转移方程:边界条件: 复杂度分析 时间复杂度:空间复杂度:

weixin_48941116的博客 1095

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣97. 交错字符串

力扣97. 交错字符串

shy的博客 371

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Leetcode 97. 交错字符串

Leetcode 97. 交错字符串1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/interleaving-string/submissions/   可以使用动态规划解决,使用dp数组保存之前的计算结果。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 状态转移方程: dp[i][j]=(dp[i−1][j]==2&&s1[i−1]==s3

珍惜 8792

LeetCode 力扣 97. 交错字符串

题目描述(困难难度) 在两个字符串 s1 和 s2 中依次取字母,问是否可以组成 S3。什么意思呢?比如 s1 = abc , s2 = de,s3 = abdce。 s1 取 1 个 字母得到 a,s1 再取个字母得到 ab,s2 取个字母得到 abd, s1 取 1 个 字母得到 abdc, s2 取 1 个 字母得到 abdce,然后就得到了 s3,所以返回 true。 解法一 回溯法...

wind_liang的博客 1122

LeetCode 97.交错字符串

LeetCode 97.交错字符串 双序列型动态规划 确定状态: 判断s1(长度为m),与s2(长度为n)是否交错生成s3(长度为p) 若m+n!=p,直接返回false s3[k]不是等于s1[i-1]就是等于s2[j-1] k=i+j-1 状态: 设f[k][i][j]为s3中前k个字符是否由s1中前i个字符或s2中前j个字符组成。 其中,k=i+j-1,优化为f[i][j] 转移方程: ...

未命名 347

LeetCode 97 交错字符串 Interleaving String

LeetCode 97 交错字符串 Interleaving String 题目描述 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. 本题给定3个字符串,求第三个能否由前两个交错的组成。示例如下: Example 1: Input: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac” Output: true Example 2: Input: s1 = “aa

andyL_05的博客 450

【LeetCode】97. 交错字符串

本文探讨了交错字符串问题,即判断字符串s3是否能由s1和s2交替组合而成。通过动态规划方法解决该问题,其中状态dp[i][j]表示s1前i个字符和s2前j个字符能否组成s3前i+j个字符。状态转移方程考虑字符匹配情况,并可通过滚动数组优化空间至O(n)。此外,还介绍了记忆化递归和BFS搜索两种替代解法。关键点包括:长度验证、保持字符相对顺序、以及多种路径选择的处理方式。时间复杂度为O(mn),其中m和n分别为s1和s2的长度。

qq_32019341的博客 1356

Leetcode 97:交错字符串

问题 Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Example 1: Input: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac” Output: true Example 2: Input: s1 = “aabcc”, s2 = “dbb...

Chestnutttttt 439

Leetcode 97. 交错字符串 C++

Leetcode 97. 交错字符串 题目 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 测试样例 1. 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac" 输出: true 2. 输入: s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc" 输出: false 题解 动态规划 dp[i][j]表示s1的前i个字符和s2的前j个字符交错构成了s3的前i+j个字符 我们考虑转

weixin_43750513的博客 402

Leetcode97 交错字符串 C++,Java,Python

Leetcode97 交错字符串 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/interleaving-string/submissions/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例...

Rp的博客 360

leetcode97. 交错字符串,二维动态规划

leetcode97. 交错字符串,二维动态规划

热爱C++和golang的学生 1433

力扣LeetCode #97 交错字符串(IsInterleave)

- 题目描述 给定三个字符串 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 + … 提示: 0 <= s1.length,

weixin_49155948的博客 343
上一篇: Leetcode 93. 复原IP地址
下一篇: Leetcode 72. 编辑距离
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值