LC 392.判断子序列
题目链接:LC 392.判断子序列
思路:思路和上一章节相同。
代码:
class Solution {
public:
bool isSubsequence(string s, string t) {
//s是行数
//t是列数
if(s.size()>t.size())return false;
vector<vector<int>> dp(s.size()+1, vector<int>(t.size()+1, 0));
for(int i=1; i<s.size()+1; i++){
for(int j=1; j<t.size()+1; 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;
return false;
}
};
LC 115.不同的子序列
题目链接:LC 115.不同的子序列
思路:注意dp数组的更新和初始化
代码:
class Solution {
public:
int numDistinct(string s, string t) {
if(s.size()<t.size())return 0;
vector<vector<uint64_t>> dp(s.size()+1, vector<uint64_t>(t.size()+1, 0));//普通的int会溢出,所以使用uint64_t
for(int a=0; a<s.size()+1; a++)dp[a][0] = 1;//将第一列初始化为1
for(int i=1; i<s.size()+1; i++){
for(int j=1; j<t.size()+1; j++){
if(s[i-1]==t[j-1]){
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];//某个位置两个值相同,那么可能的种类有:两个值前面相同的种类(dp[i-1][j-1])和子序列在之前的种类(dp[i-1][j])
}
else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[s.size()][t.size()];
}
};