代码随想录算法训练营第55天|392.判断子序列,115.不同的子序列

392.判断子序列

力扣题目链接

思路

动态规划

  • dp[i][j] 表示分别以s[i-1]和t[j-1]结尾的相同子序列的长度
  • 递推公式:if(s[i-1]==t[j-1]) dp[i][j]=dp[i-1][j-1]+1;
  • else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
  • 初始化:都初始化为0
  • 遍历顺序:从左往右

双指针

  • 慢指针指向字符串s,快指针指向字符串t
  • 当s[slow]==t[fast]时,slow++

代码

动态规划

class Solution {
public:
    /*
     * dp[i][j] 表示分别以s[i-1]和t[j-1]结尾的相同子序列的长度
     * 递推公式:if(s[i-1]==t[j-1]) dp[i][j]=dp[i-1][j-1]+1;
     * else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
	 * 初始化:都初始化为0
	 * 遍历顺序:从左往右
    */
    bool isSubsequence(string s, string t) {
        vector> dp(s.size()+1,vector(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]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        if(dp[s.size()][t.size()]==s.size()) return true;
        else return false;
    }
};
  • 时间复杂度O(mn)
  • 空间复杂度O(mn)

双指针法

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int i=0;
        for(int j=0;i
  • 时间复杂度O(n+m)
  • 空间复杂度O(1)

115.不同的子序列

力扣题目链接

思路

  • dp[i][j] 表示分别以s[i-1]和t[j-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];
  • 初始化:for(int i=0;i<=s.size();i++) dp[i][0]=1;
  • for(int j=0;j<=t.size();j++) dp[0][j]=0;
  • 遍历顺序:从左往右

代码

class Solution {
public:
    /*
     * dp[i][j] 表示分别以s[i-1]和t[j-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];
     * 初始化:for(int i=0;i<=s.size();i++) dp[i][0]=1;
     * for(int j=0;j<=t.size();j++) dp[0][j]=0;
     * 遍历顺序:从左往右
    */
    int numDistinct(string s, string t) {
        vector> dp(s.size()+1,vector(t.size()+1,0));
        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()];
    }
};
  • 时间复杂度O(mn)
  • 空间复杂度O(mn)

你可能感兴趣的:(代码随想录刷题,算法,leetcode,动态规划)