Day47: 392.判断子序列,115.不同的子序列

目录

392.判断子序列

思路 

115.不同的子序列  

思路 


392.判断子序列

392. 判断子序列 - 力扣(LeetCode) 

Day47: 392.判断子序列,115.不同的子序列_第1张图片 

思路 

1. 确定dp数组及其下标的含义 

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

2. 确定递推公式 

dp[i][j] = dp[i][j - 1];

3. dp数组初始化

vector> dp(s.size() + 1, vector(t.size() + 1, 0));

4. 确定遍历顺序 

        从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右。 

5. 举例推导dp数组 

Day47: 392.判断子序列,115.不同的子序列_第2张图片

class Solution {
public:
    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] = dp[i][j - 1];
            }
        }
        if (dp[s.size()][t.size()] == s.size()) return true;
        return false;
    }
};
  • 时间复杂度:O(n × m)
  • 空间复杂度:O(n × m)

115.不同的子序列  

115. 不同的子序列 - 力扣(LeetCode) 

Day47: 392.判断子序列,115.不同的子序列_第3张图片  

思路 

1. 确定dp数组及其下标的含义 

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

2. 确定递推公式

dp[i][j] = dp[i - 1][j];

3. dp数组初始化 

vector> dp(s.size() + 1, vector(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;

4. 确定遍历顺序 

        遍历顺序从上到下,从左到右 

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];
        }
    }
}

5. 举例推导dp数组

Day47: 392.判断子序列,115.不同的子序列_第4张图片

class Solution {
public:
    int numDistinct(string s, string t) {
        vector> dp(s.size() + 1, vector(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()];
    }
};
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

笔记参考:代码随想录

你可能感兴趣的:(算法)