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

浙公网安备 33010602011771号