步骤一、确定状态:

确定dp数组及下标含义
dp[i][j]: 长度为i的s子串删除字符得到长度为j的t的子串的方法个数

步骤二、推断状态方程:

这种情况一般都会分字符相等和不相等的情况。如果当前的字符相等,即s[i]==t[j],此时 dp[i][j[会有两个方向来(s串是不是考虑当前字符):

dp[i-1][j-1]: 这个就是都退一步之后,长度为i-1的s子串删除字符得到长度为j-1的t的子串 个数的基础上,考虑上当前字符

dp[i-1][j]: 这个是只有s退一步, 长度为i-1的s子串删除字符得到长度为j的子串个数,比 如bagg与bag, 当前g相等了,s这块是可以考虑当前字符,也可以不用当前字符的。

所以此时dp[i][i] = dp[i-1][j-1] + dp[i-1][j]
如果s[i]!=t[j]: 这个没说的了,只能是维持前面的状态,s退一步dp[i][j] = s[i-1][j]

步骤三、规定初始条件:

初始条件:

全局初始化都是0, 而最左边的一层s[i][0] = 1, 此时t 是空串, s只有都删除才能得到t,只有一种方法

步骤四、计算顺序:

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; 和 dp[i][j] = dp[i - 1][j]; 中可以看出dp[i][j]都是根据 左上方和正上方推出来的。

正向遍历s, 正向遍历t, 从(1,1)开始

class Solution:def numDistinct(self, s: str, t: str) -> int:if len(s) == 0 :return 0if len(t) == 0:return 1dp = [[0 for _ in range(len(t) + 1)] for _ in range(len(s) + 1)]for i in range(len(s)+1):dp[i][0] = 1for 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]return dp[-1][-1]

119. Leetcode 115. 不同的子序列 (动态规划-子序列问题)相关推荐

  1. 120. Leetcode 516. 最长回文子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] 步骤二.推断状态方程: 如果当前的s[i] == s[j], ...

  2. 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子 序列的长度为dp[i][j]. 步骤二.推断状态方程: 在确定递 ...

  3. 116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长 公共子序列为dp[i][j] 步骤二.推 ...

  4. 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...

  5. 122. Leetcode 647. 回文子串 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示的是区间范围[i,j] 的子串是否是回文子串 步骤二.推断状态方程: 在确定递推公式时,就要分析如下几种情况. 整体上是两种,就是s[ ...

  6. Leetcode 32 最长合法括号子序列

    算法特辑–动态规划 Leetcode 32 最长合法括号子序列 给定只有"(" 和 ")" 的字符串,求出最长的合法括号子序列. 例如:"())&qu ...

  7. 北京大学郭炜-最长上升子序列 动态规划讲解

    北京大学郭炜-最长上升子序列 动态规划讲解 问题原型: 解题思路: 找子问题,题目要求我们求1~n的最长上升子序列的长度,那我们想一想:1-2个元素的最长上升子序列的长度是多少,第1个元素的最长上升子 ...

  8. LeetCode 659. 分割数组为连续子序列

    LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...

  9. 动态规划——子序列问题——连续?不连续?

    动态规划--子序列问题--连续?不连续? 子序列问题是动态规划的一个常考题型,本篇文章主要介绍 子序列(连续)和子序列(不连续)两个问题.连续和不连续指的是子序列是否是连续的,还是说中间是可以有间隔的 ...

最新文章

  1. Pytorch使用CPU运行“Torch not compiled with CUDA enabled”
  2. MySQL5.6 新特性(全局事务标示符(GTID))
  3. illegal instruction错误
  4. [搜索]字符串的相似度问题-从编程之美说起
  5. user-agent
  6. [C++调试笔记]求电势posi.cpp
  7. 计算机网络【在一个1Mb/s的卫星信道上发送1000bit长的帧。确认总是捎带在数据帧中。帧头很短,使用3位的序列号。对以下协议而言,可以取得的最大信道利用率是多少?(a)停-等协议;(b)(c)】
  8. python观察日志(part28)--数据的加载与存储
  9. UIScrollViewDelegate-代理API详解
  10. accsess转成mysql语句_轻松教你SQL转ACCESS
  11. Spring Boot Mybatis简单使用
  12. cocos2d-x 动画工具 Flash2Cocos2d-x
  13. Linux常用命令介绍(二)——压缩与解压缩命令
  14. --》【日常】程序员常用网站
  15. 一位H3CIE攻坚之旅
  16. Python学习笔记-数据类型(元组 tuple)
  17. lighttpd跟php,lighttpd上php的配置
  18. 丰田chr内外循环怎么区分_丰田C-HR怎么开启暖风
  19. 荣耀笔记本开机黑屏错误怎么U盘重装系统教学分享
  20. Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单

热门文章

  1. MariaDB的二进制包安装方法
  2. 青少年是维护网络安全的主力军
  3. LinkedList模拟队列和堆栈
  4. 打开.264后缀名格式的文件
  5. 关于 oracle secure backup
  6. 学英语不必太在意单词
  7. 对于生活我选择了无奈
  8. wifi网络结构(下)
  9. 用java写一个折半查找_用Java写一个折半查找。
  10. java 隐藏标题栏_两种方法一句代码隐藏Activity的标题栏