代码随想录算法训练营第四十七天|leetcode115、392题

一、leetcode第392题

本题要求判断s是否为t的子序列,因此设置dp数组,dp[i][j]的含义是下标为i-1的子串与下标为j-1的子串相同字符的个数,可得递推公式是通过s[i-1]和t[j-1]是否相等区分。

具体代码如下:

cpp 复制代码
class Solution {
public:
    bool isSubsequence(string s, string t) {
    vector<vector<int>>dp(s.length()+1,vector<int>(t.length()+1,0));
    for(int i=1;i<=s.length();i++)
    {
        for(int j=1;j<=t.length();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.length()][t.length()]==s.length())
    {
        return true;
    }
    return false;
    }
};

二、leetcode第115题

本题要求s的子串与t相等的个数,因此设置dp数组,其中dp[i][j]的含义是i-1为下标的子串中包含j-1为下标的子串的个数,根据s[i-1]和t[j-1]是否相等来写递推公式,相等时递推公式dp[i][j]由dp[i-1][j-1](考虑s[i-1])和dp[i-1][j](不考虑s[i-1])构成,不相等时则等于不考虑s[i-1]时的递推式。

具体代码如下:

cpp 复制代码
class Solution {
public:
    int numDistinct(string s, string t) {
    vector<vector<uint64_t>>dp(s.length()+1,vector<uint64_t>(t.length()+1));
    for(int i=0;i<=s.length();i++)
    {
        dp[i][0]=1;
    }
    for(int j=1;j<=t.length();j++)
    {
        dp[0][j]=0;
    }
    for(int i=1;i<=s.length();i++)
    {
        for(int j=1;j<=t.length();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.length()][t.length()];
    }
};
相关推荐
YuTaoShao2 小时前
【LeetCode 热题 100】141. 环形链表——快慢指针
java·算法·leetcode·链表
小小小新人121233 小时前
C语言 ATM (4)
c语言·开发语言·算法
你的冰西瓜3 小时前
C++排序算法全解析(加强版)
c++·算法·排序算法
এ᭄画画的北北4 小时前
力扣-31.下一个排列
算法·leetcode
绝无仅有4 小时前
企微审批对接错误与解决方案
后端·算法·架构
用户5040827858395 小时前
1. RAG 权威指南:从本地实现到生产级优化的全面实践
算法
Python×CATIA工业智造6 小时前
详细页智能解析算法:洞悉海量页面数据的核心技术
爬虫·算法·pycharm
无聊的小坏坏7 小时前
力扣 239 题:滑动窗口最大值的两种高效解法
c++·算法·leetcode
黎明smaly7 小时前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法