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 意味着字符串 a 和 b 连接。

示例 1:
在这里插入图片描述
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出:true

思路分析

动规题。

1.确定dp数组含义:
dp[i][j] 表示s1前i个字符和s2前j个字符能否构成s3的前i+j个字符。

2.分析递推公式:

由于需要s1+s2来构成s3,所以设想子问题s3的最后一个字符是由谁构成的。

  • 若s3的最后一个字符由s1提供,则有:s3[i+j] = s1[i],而 s3 此前的 i+j−1个字符,可由 s1 的前 i−1 字符和 s2 的前 j 个字符共同提供。这时候就要去判断dp数组的上一个状态了,即若 dp[i−1][j]为真,则 dp[i][j]为真。
  • 若s3最后一个字符由s2提供,则同理
     if s1[i-1] == s3[i+j-1] and dp[i-1][j]:dp[i][j] = Trueif s2[j-1] == s3[i+j-1] and dp[i][j-1]:dp[i][j] = True别忘了 dp[i][j] 表示s1前i个字符(不包含i)

3.初始化

由于为了方便,所以数组都从下标1开始。
在初始化的时候 多开一行一列的dp数组。

必有:dp [0][0] = True。

dp的第二行和第二列也需要初始化,就直接比较当前s1或者s2字符和当前的s3字符是否相等,如果相等,看看前一个dp位置是否也是True,如果是则当前dp位置也是True。

for i in range(1, n + 1):dp [i][0] = dp [i - 1][0] and s1[i - 1] == s3[i - 1]
for i in range(1, m + 1):dp [0][i] = dp [0][i - 1] and s2[i - 1] == s3[i - 1]

完整代码

class Solution:def isInterleave(self, s1: str, s2: str, s3: str) -> bool:# dp[i][j] 表示s1前i个字符和s2前j个字符能否构成s3的前i+j个字符n, m, l = len(s1), len(s2), len(s3)if n + m != l:return Falsedp = [[False] * (m + 1) for _ in range(n + 1)]dp [0][0] = Truefor i in range(1, n + 1):dp [i][0] = dp [i - 1][0] and s1[i - 1] == s3[i - 1]for i in range(1, m + 1):dp [0][i] = dp [0][i - 1] and s2[i - 1] == s3[i - 1]for i in range(1,n+1):for j in range(1,m+1):if s1[i-1] == s3[i+j-1] and dp[i-1][j]:dp[i][j] = Trueif s2[j-1] == s3[i+j-1] and dp[i][j-1]:dp[i][j] = Truereturn dp[-1][-1]```

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

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

相关文章

tp8 使用rabbitMQ(1)简单队列

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 代码中的消息持久化的说明 RabbitMQ 消息持…

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Linux-权限

1.Shell命令以及运行原理 Linux 严格意义上说的是一个操作系统&#xff0c;我们称之为 “ 核心&#xff08; kernel &#xff09; “ &#xff0c;但我们一般用户&#xff0c;不能直接使用 kernel 。而是通过kernel 的 “ 外壳 ” 程序&#xff0c;也就是所谓的 shell &#x…

DLL劫持漏洞

以下是自己学习时做的一些笔记&#xff0c;希望对各位有所帮助 DLL劫持漏洞 为什么程序中会有dll的存在 对于 Windows 操作系统&#xff0c;操作系统的大部分功能都由 DLL 提供。 另外&#xff0c;当您在这些 Windows 操作系统之一上运行某一程序时&#xff0c;该程序的很多…

Python语言:猜数字游戏案例讲解

猜数字游戏题目要求如下&#xff1a;该程序随机生成一个1到100之间的整数&#xff0c;然后要求玩家在有限的次数内猜出这个数字。如果玩家猜对了&#xff0c;游戏结束并显示成功信息&#xff1b;如果玩家猜错了&#xff0c;程序会提示玩家猜的数字是偏大还是偏小&#xff0c;并…

最新版灵沐V3.3微信资源类小程序源码支持流量主

源码简介 最新版灵沐V3.3微信资源类小程序源码支持流量主&#xff0c;一套不错的流量主变现资源下载小程序&#xff0c;它支持在微信、QQ和抖音平台上运行。这次更新主要集中在全局UI设计的升级&#xff0c;并依然注重资源下载和激励视频变现的功能。另外&#xff0c;还新增了…

如何利用Python进行数据归一化?

1. 知识简介 数据归一化是数据预处理的一项重要步骤&#xff0c;它对于提高模型性能、加速模型训练、避免数值计算问题以及提高模型的泛化能力都具有重要作用。进行数据归一化可以起到以下作用&#xff1a;消除量纲影响&#xff0c;加速模型收敛&#xff0c;提高模型性能&…

每日汇评:黄金测试2000美元水平遭到拒绝,为下跌留下了空间

黄金在心理关键的2000美元水平失去了上升动力&#xff1b; 美元指数上涨持续&#xff0c;同时国债收益率反弹&#xff0c;都对黄金价格的上涨构成压力&#xff1b; 美国即将迎来感恩节假期&#xff0c;意味着明天和周五流动性较低&#xff1b; 黄金价格继续在每盎司2000美元以上…

【Linux】 id命令使用

id id命令来显示用户的UID、组GID。 著者 由阿诺德罗宾斯和大卫麦肯齐撰写。 语法 id [参数] [用户名] id命令 -Linux手册页 命令选项及作用 执行令 id --help 执行命令结果 参数 -g 或 --group  显示用户所属群组的ID。-G 或 --groups  显示用户所属附加群组的ID。…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法&#xff1a; String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法&#xff1a; static Thread currentThread() 让线程睡眠的成员方法&#xff1…

JAVA实现flappy bird游戏

图片素材 实现代码 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.Date; import java.text.SimpleDateFormat; i…

项目管理中的资源日历是什么?有什么作用

管理项目不仅需要规划和预算&#xff0c;还需要日程安排。 资源日历是一种显示项目经理或团队领导在特定时间内可用资源的工具。这种类型的项目日历可以显示团队成员和设备在特定时间段内的可用工作时间。 例如&#xff0c;如果一名员工每天工作 8 小时&#xff0c;而他已经在…