【392.判断子序列】
这道题目我对dp数组的定义和代码随想录的不一样。
我对dp数组的定义是:
dp[i][j]:以j-1结尾的s子字符串是否为以i-1结尾的t子字符串的子序列
递推公式为:
当s[i-1]==t[j-1]的时候,dp[i][j] == dp[i-1][j-1]。意思就是如果遇到相等的字母了,那就看前面的子字符串是否满足子序列,如果满足,那么新增的一个字符肯定也满足,如果不满足,新增的一个字符就肯定不满足。
当s[i-1]!=t[j-1]的时候,dp[i][j] == dp[i][j-1]。意思就是,如果遇到了两个字母不相等,那么当前dp的状态就等于前一个以j-1为结尾的t字符串的状态。
初始化:
当s为空字符串的时候,s可以作为任何长度的t的子串。其他情况都是False
那么代码如下:
class Solution {
public:
bool isSubsequence(string s, string t) {
vector<vector<bool>>dp(t.size()+1, vector<bool>(s.size()+1, false));
for(int i = 0; i <= t.size(); i++){
dp[i][0] = true;
}
for(int i = 1; i <= t.size(); i++){
for(int j = 1; j <= s.size(); j++){
if(s[j-1] == t[i-1])dp[i][j] = dp[i-1][j-1];
else dp[i][j] = dp[i-1][j];
}
}
return dp[t.size()][s.size()];
}
};
【115.不同的子序列】
通过做这个题目,发现了一个动态规划问题找到递推公式的方法是先把二维数组的推导出来。在推导的过程中,去看每一个值是怎么求得的,从而找到规律,再去解释这个递推公式的意义。不用一开始就把递推公式先想出来。
当然,dp数组的意义还是问题求什么,dp数组的值就直接反映了最终的结果。
需要注意的是:dp数组的数据类型是uint_16