119. Leetcode 115. 不同的子序列 (动态规划-子序列问题)
步骤一、确定状态:
确定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. 不同的子序列 (动态规划-子序列问题)相关推荐
- 120. Leetcode 516. 最长回文子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] 步骤二.推断状态方程: 如果当前的s[i] == s[j], ...
- 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子 序列的长度为dp[i][j]. 步骤二.推断状态方程: 在确定递 ...
- 116. Leetcode 1143. 最长公共子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长 公共子序列为dp[i][j] 步骤二.推 ...
- 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...
- 122. Leetcode 647. 回文子串 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示的是区间范围[i,j] 的子串是否是回文子串 步骤二.推断状态方程: 在确定递推公式时,就要分析如下几种情况. 整体上是两种,就是s[ ...
- Leetcode 32 最长合法括号子序列
算法特辑–动态规划 Leetcode 32 最长合法括号子序列 给定只有"(" 和 ")" 的字符串,求出最长的合法括号子序列. 例如:"())&qu ...
- 北京大学郭炜-最长上升子序列 动态规划讲解
北京大学郭炜-最长上升子序列 动态规划讲解 问题原型: 解题思路: 找子问题,题目要求我们求1~n的最长上升子序列的长度,那我们想一想:1-2个元素的最长上升子序列的长度是多少,第1个元素的最长上升子 ...
- LeetCode 659. 分割数组为连续子序列
LeetCode 659. 分割数组为连续子序列 回顾 根据题意,每个元素只会涉及两种情况: 已经存在nums[i]-1结尾的序列,我们把nums[i]接到之前的某个序列后. 尝试以nums[i]为头 ...
- 动态规划——子序列问题——连续?不连续?
动态规划--子序列问题--连续?不连续? 子序列问题是动态规划的一个常考题型,本篇文章主要介绍 子序列(连续)和子序列(不连续)两个问题.连续和不连续指的是子序列是否是连续的,还是说中间是可以有间隔的 ...
最新文章
- Pytorch使用CPU运行“Torch not compiled with CUDA enabled”
- MySQL5.6 新特性(全局事务标示符(GTID))
- illegal instruction错误
- [搜索]字符串的相似度问题-从编程之美说起
- user-agent
- [C++调试笔记]求电势posi.cpp
- 计算机网络【在一个1Mb/s的卫星信道上发送1000bit长的帧。确认总是捎带在数据帧中。帧头很短,使用3位的序列号。对以下协议而言,可以取得的最大信道利用率是多少?(a)停-等协议;(b)(c)】
- python观察日志(part28)--数据的加载与存储
- UIScrollViewDelegate-代理API详解
- accsess转成mysql语句_轻松教你SQL转ACCESS
- Spring Boot Mybatis简单使用
- cocos2d-x 动画工具 Flash2Cocos2d-x
- Linux常用命令介绍(二)——压缩与解压缩命令
- --》【日常】程序员常用网站
- 一位H3CIE攻坚之旅
- Python学习笔记-数据类型(元组 tuple)
- lighttpd跟php,lighttpd上php的配置
- 丰田chr内外循环怎么区分_丰田C-HR怎么开启暖风
- 荣耀笔记本开机黑屏错误怎么U盘重装系统教学分享
- Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单