2023.8.25
本题要判断子序列,可以使用动态规划来做,定义一个二维dp数组。 接下来就是常规的动态规划求解子序列的过程。 给出两种定义dp数组的方法。
二维bool型dp数组:
class Solution {
public:
bool isSubsequence(string s, string t) {
if(s.size() == 0 && t.size() == 0) return true;
if(s.size() == 0) return true;
if(t.size() == 0) return false;
vector<vector<bool>> dp(s.size()+1 , vector<bool>(t.size()+1 , false));
dp[0][0] = true;
//初始化第一行
for(int i=1; i<=t.size(); i++)
{
dp[0][i] = dp[0][i-1];
}
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];
else dp[i][j] = dp[i][j-1];
}
}
return dp[s.size()][t.size()];
}
};
二维int型dp数组:
class Solution {
public:
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] = dp[i][j-1];
}
}
if(dp[s.size()][t.size()] == s.size()) return true;
else return false;
}
};