代码随想录训练营第55天 | ● 392.判断子序列 ● 115.不同的子序列
最佳答案 问答题库498位专家为你答疑解惑
392.判断子序列
题目链接:https://leetcode.com/problems/is-subsequence
解法:
1. 确定dp数组(dp table)以及下标的含义
dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。
这里dp[i][j]的含义是长度,而不是是否为子序列。这点没想到是这么处理的,或许是为了后面的题目一脉相承。
2. 递推公式
分两种情况讨论:
- 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。
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[i][j-1]一定是已经有了。之所以是j-2而不是i-2,因为i是s的下标,s是短的子串,我们算的是t包含s,所以s不能往回走。
3. 返回结果
初始化肯定都是0,所以无需多言。
dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。返回为True。
边界条件:无
时间复杂度:O(mn)
空间复杂度:O(mn)
class Solution(object):def isSubsequence(self, s, t):dp = [[0] * (len(t)+1) for i 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]if dp[-1][-1] == len(s):return Truereturn False
115.不同的子序列
题目链接:https://leetcode.com/problems/distinct-subsequences
解法:
这道题目相对于编辑距离,简单了不少,因为本题相当于只有删除操作,不用考虑替换增加之类的。
不过就算是删除操作,还是不好考虑。
dp[i][j]表示以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。
确定递推公式时,当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成:
一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即当前s子串和t子串的最后一位字母匹配上了,所以个数还是 dp[i-1][j-1]。
一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]。因为是要求用下标为i的s去匹配t。
还有初始化也比较讲解,所以如果下次写不出来,还是得看题解:不同的子序列
边界条件:无
时间复杂:O(mn)
空间复杂:O(mn)
class Solution(object):def numDistinct(self, s, t):dp = [[0] * (len(t)+1) for i in range(len(s)+1)]for i in range(len(s)+1):dp[i][0] = 1for j in range(len(t)+1):dp[0][j] = 0dp[0][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]
99%的人还看了
相似问题
- 【Django-DRF用法】多年积累md笔记,第3篇:Django-DRF的序列化和反序列化详解
- 【Java 进阶篇】JavaScript JSON 语法入门:轻松理解数据的序列化和反序列化
- 【python学习】基础篇-常用模块-pickle模块:序列化和反序列化
- ZC序列理论学习及仿真
- 时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
- 代码随想录算法训练营第二十九天| 491 递增子序列 46 全排列
- 最长递增子序列
- 深入解析序列模型:全面阐释 RNN、LSTM 与 Seq2Seq 的秘密
- c#Nettonsoft.net库常用的方法json序列化反序列化
- 基于C#实现最长公共子序列
猜你感兴趣
版权申明
本文"代码随想录训练营第55天 | ● 392.判断子序列 ● 115.不同的子序列":http://eshow365.cn/6-30974-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!