392.判断子序列
题目链接:代码随想录
视频讲解:动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列_哔哩哔哩_bilibili
解题思路
本题和求最长公共子序列是一样的,值就是s字符串的长度,如果一致就返回true,如果不一致就是false
这题也可以看作编辑距离入门级别的题目,仅t字符串会删元素
dp容器依旧选择二维数组,行是s字符串,列是t的字符串
1.dp[i][j] 以i-1为结尾的字符串s,以j-1为结尾的字符串t的相同子序列的长度(方便初始化)
2. if(s[i-1] == t[j-1] ) dp[i][j] = dp[i-1][j-1] + 1 //应该是s和t的前一面一段的相同子序列的长度加一
else dp[i][j] = dp[i][j-1] //如果不相同,那么就删除t字符串这个当前字符,去判断j-1之前的字符串
3.初始化
dp[i][0] = 0;
dp[0][j] = 0 ;
4.遍历顺序
我们是从左上方和左方推导而来
因此从左到右,从上到下
for(int i =1 ; i<=s.size() ; i++)
for(int j =1 ; j<=t,size() ; j++)
class Solution {
public:
bool isSubsequence(string s, string t) {
vector<vector<int>> dp(s.size()+1 , vector<int>(t.size()+1,0)); //以i-1,j-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] + 1; //相等就同时回退,看前面的子序列的长度
else dp[i][j] = dp[i][j-1] ; //如果不相等就对t进行删减
}
}
if(dp[s.size()][t.size()]==s.size()) return true;
return false;
}
};