(54/60)判断子序列、不同的子序列

判断子序列

leetcode:392. 判断子序列

动态规划

代码实现

class Solution {
public:
/*
不连续子序列(公共子序)
0~i-1 0~j-1的最长公共子序长度是dp[i][j]
if(s[i-1] == s[j-1]) dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
all init to 0

*/
    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] = max(dp[i-1][j],dp[i][j-1]);
                // cout<<dp[i][j]<<' ';
            }
            // cout<<endl;
        }

        if(dp[s.size()][t.size()] == s.size())
            return true;
        else   
            return false;
    }
};

或者由于s是整个子串都要比较的,可以不考虑dp[i-1][j]的情况。

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

不同的子序列

leetcode:115. 不同的子序列

动态规划

代码实现

class Solution {
public:
/*
s[0:i-1]中t[0:j-1]出现的次数为dp[i][j]

*/
    int numDistinct(string s, string t) {
        vector<vector<uint64_t>> dp(s.size()+1,vector<uint64_t>(t.size()+1,0));
        for(int i = 0;i <= s.size();i++) dp[i][0] = 1;  // t为""时含于s
        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()];
    }
};
posted @ 2024-03-28 17:02  Tazdingo  阅读(41)  评论(0)    收藏  举报