本文最后更新于593 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
https://programmercarl.com/0392.%E5%88%A4%E6%96%AD%E5%AD%90%E5%BA%8F%E5%88%97.html
1.本题基于上面几个子序列,子数组题目,让我对于动态规划的题目有了更深层的认识,本题对于状态转移的公式更是深刻,就像是前面的题的dp数组的含义本题的含义也还是`以i – 1为结尾字符串 s 和以j – 1为结尾字符串 t 的相同子序列的长度。本题的递归公式就是当两个数不相同的时候,选择字符串 t 的前置结果进行状态转移,这就是动态规划的精髓所在,子结果来反映总体要求的结果。而借用代码随想录的一句话:大家可以发现和 1143.最长公共子序列 (opens new window)的递推公式基本那就是一样的,区别就是 本题 如果删元素一定是字符串t,而 1143.最长公共子序列 是两个字符串都可以删元素。
所以总结起来一句话要看清楚状态转移方程。
CPP
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;
}
return false;
}
};