Day54代码随想录动态规划part15:392.判断子序列、115.不同的子序列

Day54 动态规划part15编辑距离

392.判断子序列

leetcode链接:392. 判断子序列 - 力扣(LeetCode)

题意:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例 1:

  • 输入:s = "abc", t = "ahbgdc"
  • 输出:true

思路:本题可转化为求最长公共子序列,如果最长公共子序列长度为len(s)则可以返回true

注意递推公式!

class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp = [[0]*(len(t)+1) for _ in range(len(s)+1)] #以i-1,j-1为结尾res =0for i in range(1, len(s)+1):for j in range(1, len(t)+1):if s[i-1] == t[j-1]:dp[i][j] = dp[i-1][j-1]+1else:dp[i][j] = dp[i][j-1]# 如果t[0, j-1]没有和s[0,i]相同,那么考察t[0, j-2]的最长# 相当于本题是以s为基准if dp[i][j] > res:res = dp[i][j]if res == len(s):return Truereturn False

115.不同的子序列

leetcode题目链接:115. 不同的子序列 - 力扣(LeetCode)

题意:给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

思路:有多少种删除元素的方式,让s和t相同,仍然以s为基准

  • dp数组含义:dp[i][j]:i-1结尾的s中出现以j-1为结尾的t的个数为dp[i][j]
  • 递推公式:
    • 如果s[i-1] == t[j-1]:dp[i][j] = dp[i-1][j-1] + dp[i-1][j] (1)使用s[i-1]匹配:个数为dp[i-1][j-1] ;(2)不使用s[i-1]:也就是删除这个字母也可能有相同的子串,个数为dp[i-1][j];这里求的是s里面有多少个t,所以不需要删除t里的元素的
    • 不相同的情况:dp[i][j] = dp[i-1][j]
  • 初始化:从递推公式可以看出第一行第一列需要初始化,从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j] 是从上方和左上方推导而来,如图:,那么 dp[i][0] 和dp[0][j]是一定要初始化的。
    • dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。
    • 再来看dp[0][j],dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。那么dp[0][j]一定都是0,s如论如何也变成不了t。
    • 最后就要看一个特殊位置了,即:dp[0][0] 应该是多少。dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。
  • 遍历顺序:从上到下,从左到右
  • 打印dp数组
class Solution:def numDistinct(self, s: str, t: str) -> int:dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]for i in range(len(s)+1): # t为基准dp[i][0] = 1for j in range(1, len(t)+1):dp[0][j] = 0for i in range(1, len(s)+1):for j in range(1, len(t)+1):if s[i-1] == t[j-1]:dp[i][j] = dp[i-1][j-1] + dp[i-1][j]else:dp[i][j] = dp[i-1][j]# print(dp)return dp[-1][-1]

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

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

相关文章

构建第一个ArkTS应用之@LazyForEach:数据懒加载

LazyForEach从提供的数据源中按需迭代数据,并在每次迭代过程中创建相应的组件。当在滚动容器中使用了LazyForEach,框架会根据滚动容器可视区域按需创建组件,当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用。 接口…

上海交大携手阿里巴巴成立人工智能与系统联合实验室

5 月 8 日,上海交通大学电子信息与电气工程学院(简称电院)与阿里巴巴集团宣布共同成立人工智能与系统联合实验室(后称“联合实验室”),并在上海交大闵行校区举行了揭牌仪式。 上海交大电院副院长王贺升教授…

Go 语言将 PDF 转为 Word 如何处理

文章推荐 1 作为程序员,开发用过最好用的AI工具有哪些? 2 Github Copilot正版的激活成功,终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手,帮助你提高写代码效率 5 Jetbrains的a…

python实现图片模式转换成素描模式

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 素描,是一种用线条来描绘物体、场景或人物的绘画方式,它可以是简单的线条勾勒,也可以是复杂的光影渲染。这种艺术形式主要依赖线条和明暗关系来表现形态、空

Redis- 如何防止攻击者利用未授权访问 Redis 服务的攻击获取目标机器的 root 权限

攻击概述 以下攻击步骤展示了如何利用未加防护的 Redis 服务器,通过配置 Redis 的持久化机制,将攻击者的 SSH 公钥写入目标机器的 ~/.ssh/authorized_keys 文件,从而获取目标机器的 root 权限。这是一种典型的利用未授权访问 Redis 服务的攻…

亚信安慧AntDB:赋能业务管理 推动数字化转型

在当今数据驱动的信息时代,数据库正面临着前所未有的挑战与机遇。随着技术的飞速发展和用户需求的不断变化,传统的数据库解决方案已逐渐显得力不从心,难以满足运营商日益复杂的业务需求。而亚信安慧AntDB数据库则以其强大的功能和优越的性能&…

PyTorch进行CIFAR-10图像分类

本节将通过一个实战案例来详细介绍如何使用PyTorch进行深度学习模型的开发。我们将使用CIFAR-10图像数据集来训练一个卷积神经网络。 神经网络训练的一般步骤如图5-3所示。 (1)加载数据集,并做预处理。 (2)预处理后的…

sin^2(x) 的图像

[TOC](sin^2(x) 的图像) 正文 这里记录一下 s i n 2 x sin^2{x} sin2x 的图像。 函数值以正弦的形式在 [0, 1] 区间内波动。 如果大家觉得有用,就点个赞让更多的人看到吧~

Ant Design Vue 的组件库的<a-tab-pane>的force-render

在使用类似 Ant Design Vue 的组件库时&#xff0c;force-render 属性通常用于指示是否强制渲染标签页的内容&#xff0c;即使它还没有被显示。通常&#xff0c;在一个标签页组件&#xff08;如 <a-tab-pane>&#xff09;中&#xff0c;内容只有在用户激活该标签页时才会…

嵌入式文件系统

嵌入式文件系统 文件系统简介 在计算机系统中&#xff0c; 需要用到大量的程序和数据&#xff0c; 它们大部分以文件的形式存放在外部存储当中&#xff0c; 根据需要可随时调入内存使用 如果用户直接管理外存文件所面临的问题&#xff1a; 必须熟悉外存的物理特性了解各种存…

英语新概念2-回译法-lesson14

第一次回译 I had a amusing experience. I kept driving to the next town when I left a small village in the south of Franch.A teenager waved to me in the path.I stopped my car, he asked me to give him a lift.As soon as he get my car,I say good morning in Fr…

【Kubernetes】污点、容忍度、亲和性、调度和重启策略

标签、污点、容忍度、亲和性 一、标签1、定义2、给资源打标签【1】给Pod打标签【2】给Service打标签【3】给Node打标签 3、查看资源标签 二、节点选择器1、nodeName2、nodeSelector 三、污点、容忍度、亲和性1、node节点亲和性【1】硬亲和性【2】软亲和性 2、pod节点亲和性【1】…

LeetCode hot100-36-N

94. 二叉树的中序遍历给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。这题都写不出来&#xff0c;废了 以前学数据结构的时候&#xff0c;书上老师写伪代码&#xff0c;于是递归版的遍历在伪代码中看起来就很简单。但是怎么输出这个list呢&#xff0c;其实是另…

安泰电子电压放大器应用及示例是什么样的

电压放大器是电子电路中常用的一种器件&#xff0c;用于将输入信号的电压放大至所需的输出电压。它在许多领域中有着重要的应用&#xff0c;包括通信、音频放大、仪器测量等。以下是电压放大器的一些应用及示例&#xff1a; 信号处理&#xff1a;在许多电子系统中&#xff0c;需…

Kasawaki川崎机器人故障维修

在当今的自动化工业领域&#xff0c;川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分&#xff0c;伺服电机的作用至关重要。然而&#xff0c;就像所有机械设备一样&#xff0c;也可能会遭遇电机磨损或故障&#xff0c;需要适时的川崎…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

linux - 搭建部署ftp服务器

ftp 服务: 实现ftp功能的一个服务,安装vsftpd软件搭建一台ftp服务器 ftp协议: 文件传输协议 (file transfer protocol),在不同的机器之间实现文件传输功能, 例如 视频文件下载,源代码文件下载 公司内部:弄一个专门的文件服务器,将公司里的文档资料和视频都存放…

基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型

整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真&#xff0c;该模型使用线性死区补偿的PMSM矢量控制算法进行仿真&#xff0c;使用Foc电流双闭环 。 1.模块划分清晰&#xff0c;补偿前后仿真有对比&#xff0c;易于学习; 2.死区补偿算法的线性区区域可调; 3.自…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…

Python接口自动化测试之动态数据处理

在前面的知识基础上介绍了在接口自动化测试中&#xff0c;如何把数据分离出来&#xff0c;并且找到它的共同点&#xff0c;然后依据这个共同点来找到解决复杂问题的思想。我一直认为&#xff0c;程序是人设计的&#xff0c;它得符合人性&#xff0c;那么自动化测试的&#xff0…