企业管理系统网站开发成本是多少?
摘要:企业管理系统网站开发标书,网站建设开发成本,wordpress个性化,深圳注册公司创业补贴代码随想录算法训练营第58天|动态规划part15|392.判断子序列、115.不同的子序
企业管理系统网站开发标书,网站建设开发成本,wordpress个性化,深圳注册公司创业补贴代码随想录算法训练营第58天#xff5c;动态规划part15#xff5c;392.判断子序列、115.不同的子序列
392.判断子序列
392.判断子序列
思路#xff1a;
#xff08;这道题也可以用双指针的思路来实现#xff0c;时间复杂度也是O(n)#xff09;
这道题应该算是编辑距…代码随想录算法训练营第58天动态规划part15392.判断子序列、115.不同的子序列
392.判断子序列
392.判断子序列
思路
这道题也可以用双指针的思路来实现时间复杂度也是O(n)
这道题应该算是编辑距离的入门题目因为从题意中我们也可以发现只需要计算删除的情况不用考虑增加和替换的情况。
所以掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础。
动态规划五部曲分析如下
确定dp数组dp table以及下标的含义
dp[i][j] 表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t相同子序列的长度为dp[i][j]。
注意这里是判断s是否为t的子序列。即t的长度是大于等于s的。
确定递推公式
在确定递推公式的时候首先要考虑如下两种操作整理如下
if (s[i - 1] t[j - 1]) t中找到了一个字符在s中也出现了if (s[i - 1] ! t[j - 1]) 相当于t要删除元素继续匹配
if (s[i - 1] t[j - 1])那么dp[i][j] dp[i - 1][j - 1] 1;因为找到了一个相同的字符相同子序列长度自然要在dp[i-1][j-1]的基础上加1如果不理解在回看一下dp[i][j]的定义
if (s[i - 1] ! t[j - 1])此时相当于t要删除元素t如果把当前元素t[j - 1]删除那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了即dp[i][j] dp[i][j - 1];
dp数组如何初始化
从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1]所以dp[0][0]和dp[i][0]是一定要初始化的。
这里大家已经可以发现在定义dp[i][j]含义的时候为什么要表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t相同子序列的长度为dp[i][j]。
因为这样的定义在dp二维矩阵中可以留出初始化的区间如图
如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t初始化就比较麻烦了。
dp[i][0] 表示以下标i-1为结尾的字符串与空字符串的相同子序列长度所以为0. dp[0][j]同理。
vectorvectorint dp(s.size() 1, vectorint(t.size() 1, 0));
确定遍历顺序
同理从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1]那么遍历顺序也应该是从上到下从左到右 举例推导dp数组 dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明s与t的最长相同子序列就是s那么s 就是 t 的子序列。
图中dp[s.size()][t.size()] 3 而s.size() 也为3。所以s是t 的子序列返回true。
代码
python
class Solution(object):def isSubsequence(self, s, t)::type s: str:type t: str:rtype: booldp [[0] * (len(t)1) for _ in range(len(s)1)]for 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]return dp[-1][-1] len(s)115.不同的子序列
115.不同的子序列
思路
动态规划五部曲
确定dp数组dp table以及下标的含义
dp[i][j]以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
