代码随想录 -- day55 --392.判断子序列 、115.不同的子序列

392.判断子序列

dpij 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dpij

  • if (si - 1 == tj - 1)
    • t中找到了一个字符在s中也出现了
  • if (si - 1 != tj - 1)
    • 相当于t要删除元素,继续匹配

if (si - 1 == tj - 1),那么dpij = dpi - 1j - 1 + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dpi-1j-1的基础上加1(如果不理解,在回看一下dpij的定义

if (si - 1 != tj - 1),此时相当于t要删除元素,t如果把当前元素tj - 1删除,那么dpij 的数值就是 看si - 1与 tj - 2的比较结果了,即:dpij = dpij - 1;

cpp 复制代码
class Solution {
public:
    bool isSubsequence(string s, string t) {
        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];
            }
            
        }
        if(dp[s.size()][t.size()] == s.size())
        {
            return true;
        }
        return false;
    }
};

115.不同的子序列

dpij:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dpij

  • si - 1 与 tj - 1相等
  • si - 1 与 tj - 1 不相等

当si - 1 与 tj - 1相等时,dpij可以有两部分组成。

一部分是用si - 1来匹配,那么个数为dpi - 1j - 1。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dpi-1j-1

一部分是不用si - 1来匹配,个数为dpi - 1j

cpp 复制代码
class Solution {
public:
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size() + 1, vector<uint64_t>(t.size() + 1));
        for(int i = 0; i < s.size(); i++)
        {
            dp[i][0] = 1;
        }
        for(int j = 1; j < t.size(); j++)
        {
            dp[0][j] = 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] + dp[i - 1][j];
                else dp[i][j] = dp[i - 1][j];
            }
        }
        return dp[s.size()][t.size()];
    }
};
相关推荐
2601_9628517436 分钟前
计算机毕业设计之基于YOLOV10的低光照目标检测算法研究与实现
大数据·算法·yolo·目标检测·信息可视化·cnn·课程设计
magicwt38 分钟前
快手自动出价论文GAVE阅读笔记
算法
智者知已应修善业1 小时前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯
小巧的砖头2 小时前
使用SVN+CruiseControl+ANT实现持续集成之一
学习·算法
人道领域2 小时前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法
小O的算法实验室2 小时前
2026年ACM TCH,动态救护车路径优化:结合 K-means 聚类与多目标粒子群算法两阶段策略
算法
在书中成长2 小时前
HarmonyOS 小游戏《对战五子棋》开发第8篇 - GomokuEngine核心引擎设计(三):五子连珠判定算法
算法·华为·harmonyos
Let's Chat Coding2 小时前
MAC 消息认证码:同时验证来源和完整性
算法·哈希算法
cc.ChenLy5 小时前
算法从入门到精通实战指南
算法
Jerry11 小时前
LeetCode 160. 相交链表
算法