算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列

这篇具有很好参考价值的文章主要介绍了算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

392.判断子序列

本题可以直接用双指针解法。但是本题是编辑距离的入门题目,故采用动态规划解法为后序“编辑距离”类题目打基础。
本题与最大子序列非常相似,但不同的是s必须连续,t可以不连续。
五部曲
1、dp[i][j]
表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。
2、递推公式
if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
else dp[i][j] = dp[i][j-1]
3、初始化
在定义dp[i][j]含义的时候为什么要表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。

因为这样的定义在dp二维矩阵中可以留出初始化的区间,如图:
算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列4、遍历顺序
算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列

class Solution {
public:
    bool isSubsequence(string s, string t) {
        if(s.length() > t.length()) return false;
        vector<vector<int>> dp(s.size()+1,vector<int>(t.size()+1,0));
        for(int i = 1; i <= s.size();++i){
            for(int j = 1; j <= t.size();++j ){
                if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
                else dp[i][j] = dp[i][j-1];
            }
        }
        return dp[s.size()][t.size()] == s.size();
    }
};

115.不同的子序列

算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列3、初始化
每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。

dp[i][0]表示什么呢?

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。文章来源地址https://www.toymoban.com/news/detail-437284.html

class Solution {
public:
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size()+1,vector<uint64_t>(t.size()+1,0));
        for(int i = 0; i <= s.size();++i) dp[i][0] = 1;

        for(int i = 1; i<=s.size();++i){
            for(int j = 1; j<= t.size();++j){
                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[s.size()][t.size()];
    }
};

到了这里,关于算法 DAY55 动态规划11 392.判断子序列 115.不同的子序列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录第五十七天|● 392.判断子序列 ● 115.不同的子序列

    题目: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一个子序列,而\\\"aec\\\"不是)。 进阶: 如果有大量输入的 S,称作 S1, S2, … , Sk 其中

    2024年02月06日
    浏览(34)
  • 算法记录 | Day55 动态规划

    思路: 1.确定dp数组(dp table)以及下标的含义: dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为 dp[i][j] 。 2.确定递推公式: if (s[i - 1] == t[j - 1]) t中找到了一个字符在s中也出现了, dp[i][j] = dp[i - 1][j - 1] + 1 if (s[i - 1] != t[j - 1]) 相当于t要

    2024年02月03日
    浏览(33)
  • 代码随想录 动态规划 判断子序列,不同的子序列

    392. 判断子序列 给定字符串  s  和  t  ,判断  s  是否为  t  的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如, \\\"ace\\\" 是 \\\"abcde\\\" 的一个子序列,而 \\\"aec\\\" 不是)。 思路: 1. 使用哈希统计两个序

    2024年02月07日
    浏览(33)
  • day55 算法训练|动态规划part15

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,\\\"ace\\\"是\\\"abcde\\\"的一个子序列,而\\\"aec\\\"不是)。 其实就是最长公共子序列的变种题:如果公共子序列长度等于

    2024年02月02日
    浏览(31)
  • Leetcode 子序列 53 392 115 583

    1.双指针 2.动态规划 初始化: 这里感觉对我来说有点难以理解 dp[i][0] 这里我的理解是,以下标i-1位结尾的s和空集能够相同的子序列的个数,那么肯定只有一个,就是把s里的全部删掉 dp[0][j]s是空数组所以不可能和t一样(除了t是空数组的时候,所以dp[0][0]为1) 注意: 这里不

    2024年02月13日
    浏览(30)
  • 算法day39|动态规划:不同路径Ⅰ、Ⅱ

    https://leetcode.cn/problems/unique-paths/ 了解下标含义——这里是行列数 理解为什么dfs不能做这道题(超时) https://leetcode.cn/problems/unique-paths-ii/ 初始化时也应该注意限制条件 注意特殊情况的判断

    2024年02月06日
    浏览(37)
  • 【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列

    视频算法专题 动态规划汇总 二分查找算法合集 给你一个字符串 s ,返回 s 中不同的非空回文子序列个数 。由于答案可能很大,请返回对 109 + 7 取余 的结果。 字符串的子序列可以经由字符串删除 0 个或多个字符获得。 如果一个序列与它反转后的序列一致,那么它是回文序列

    2024年01月19日
    浏览(38)
  • 【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目

    【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 动态规划汇总 给你一个二进制字符串 binary 。 binary 的一个 子序列 如果是 非空 的且没有 前导 0 (除非数字是 “0” 本身),那么它就是一个 好 的子序列。 请你找到 binary 不同好子序列 的数目。 比方说,

    2024年02月21日
    浏览(26)
  • Day48 算法记录|动态规划15 (子序列)

    这道题和1143最长公共字串相同 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。 方法二 双指针 dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。 这个把递推讲的很详细 初始化: 状态方程: 相同的情况:

    2024年02月15日
    浏览(24)
  • Day47 算法记录|动态规划14子序列

    这道题和718. 最长重复子数组的区别:这道题的 子序列可以不连续 这个视频讲解的很好 和上面一道题一摸一样 以绘制连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且直线不与任何其他连线(非水平线)相交。 讲解的很好的一个 d p [ i ] dp[i] d p [ i ] 表示包括下标i(以

    2024年02月15日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包