算法训练营第五十五天||● 392.判断子序列 ● 115.不同的子序列

● 392.判断子序列

这道题能理解,慢慢涉及到一个字符串中删除元素

动态规划:

class Solution {
public:
    bool isSubsequence(string s, string t) {
        if(s.size()>t.size()) return false;
        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;
        }else{
            return false;
        }
    }
};

双指针贪心:

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int m = s.size();
        int n = t.size();
        int i =0,j=0;
        while(j!=n){
            if(s[i]==t[j]){
                i++;
                j++;
            }else{
                j++;
            }
        }
        return i==m;
    }
};

115.不同的子序列

这道题不理解递推公式,还需要再看 这几天太忙了 没时间 先简单过一遍吧

class Solution {
public:
    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()];
    }
};

你可能感兴趣的:(代码随想录一刷,算法,leetcode,数据结构)