首页 > 编程语言 >代码随想录算法训练营第五十八天 | 392.判断子序列

代码随想录算法训练营第五十八天 | 392.判断子序列

时间:2024-06-16 14:28:57浏览次数:24  
标签:392 int 随想录 序列 字符串 长度 第五十八 dp

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;
    }
};

标签:392,int,随想录,序列,字符串,长度,第五十八,dp
From: https://blog.csdn.net/m0_73815931/article/details/139643987

相关文章