首页 > 编程语言 >代码随想录算法训练营第四十五天|LeetCode115.不同的子序列、LeetCode583.两个字符串的删除操作、LeetCode72.编辑距离

代码随想录算法训练营第四十五天|LeetCode115.不同的子序列、LeetCode583.两个字符串的删除操作、LeetCode72.编辑距离

时间:2024-12-14 09:01:23浏览次数:6  
标签:LeetCode72 四十五天 string int 随想录 Length 讲解 字符串 dp

前言

打卡代码随想录算法训练营第49期第四十五天ε(*′・∀・`)з゙

首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。


LeetCode115 不同的子序列

题目链接:115 不同的子序列

文章讲解:不同的子序列

视频讲解:卡哥讲解 —— 不同的子序列

本题依然是子序列问题,还是更难了一点点。

public class Solution {
    public int NumDistinct(string s, string t) {
         //dp数组含义:以i-1为结尾的s字符串中有以j-1为结尾的t字符串dp[i , j]个
        int[ , ] dp = new int[s.Length + 1 , t.Length + 1];
        //初始化
        for(int i = 0; i < s.Length; i++)
            dp[i , 0] = 1;
        for(int i = 1; i <= s.Length; i++)
        {
            for(int j = 1; j <= t.Length; j++)
            {
                //递推公式
                if(s[i - 1] == t[j - 1])
                    dp[i , j] = dp[i - 1 , j - 1] + dp[i - 1 , j];
                else
                    dp[i , j] = dp[i - 1 , j];
            }
        }
        return dp[s.Length , t.Length];
    }
}

LeetCode583 两个字符串的删除操作

题目链接:583 两个字符串的删除操作

文章讲解:两个字符串的删除操作

视频讲解:卡哥讲解 —— 两个字符串的删除操作

本题要对两个字符串都要操作,更进一步。

public class Solution {
    public int MinDistance(string word1, string word2) {
        //dp数组含义:以i-1为s结尾的字符串中有以j-1为结尾的字符串最少删除个数为dp[i , j]个
        int[,] dp = new int[word1.Length + 1 , word2.Length + 1];
        //当j为0时 删除最少个数为i个
        for(int i = 1; i <= word1.Length; i++)
            dp[i , 0] = i;
        //当i为0时 删除最少个数为j个
        for(int j = 1; j <= word2.Length; j++)
            dp[0 , j] = j;
        for(int i = 1; i <= word1.Length; i++)
        {
            for(int j = 1; j <= word2.Length; j++)
            {
                //递推公式
                if(word1[i - 1] == word2[j - 1])
                    dp[i , j] = dp[i - 1 , j - 1];
                else
                    dp[i , j] = Math.Min(dp[i - 1 , j] + 1 , dp[i , j - 1] + 1);
            }
        }
        return dp[word1.Length , word2.Length];
    }
}

LeetCode72 编辑距离

题目链接:72 编辑距离

文章讲解:编辑距离

视频讲解:卡哥讲解 —— 编辑距离

之前的几道题目都是在给这道题做铺垫。

public class Solution {
    public int MinDistance(string word1, string word2) {
        //dp数组含义:以i-1为s结尾的字符串中有以j-1为结尾的字符串最少删除个数为dp[i , j]个
        int[,] dp = new int[word1.Length + 1 , word2.Length + 1];
        //当j为0时 删除最少个数为i个
        for(int i = 1; i <= word1.Length; i++)
            dp[i , 0] = i;
        //当i为0时 删除最少个数为j个
        for(int j = 1; j <= word2.Length; j++)
            dp[0 , j] = j;
        for(int i = 1; i <= word1.Length; i++)
        {
            for(int j = 1; j <= word2.Length; j++)
            {
                if(word1[i - 1] == word2[j - 1])
                    dp[i , j] = dp[i - 1 , j - 1];
                else
                {
                    //因为删除操作和添加操作的结果一致 所以这里只用考虑这种情况即可
                    dp[i , j] = Math.Min(dp[i - 1 , j] + 1 /*删除*/ , dp[i , j - 1] + 1/*删除*/);
                    dp[i , j] = Math.Min(dp[i - 1 , j - 1] + 1 , dp[i , j]);//替换操作
                }             
            }
        }
        return dp[word1.Length , word2.Length];
    }
}

今天的题目就是为了编辑距离,所以看一下编辑距离总结。明天见~~~

标签:LeetCode72,四十五天,string,int,随想录,Length,讲解,字符串,dp
From: https://blog.csdn.net/tancxiaohei23/article/details/144441693

相关文章

  • 代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 9
    654.最大二叉树  题目链接/文章讲解:代码随想录视频讲解:又是构造二叉树,又有很多坑!|LeetCode:654.最大二叉树_哔哩哔哩_bilibili创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组......
  • 代码随想录训练营第十六天| 513. 找树左下角的值 112. 路径总和 106.从中序与后序遍历
    513.找树左下角的值 题目链接:513.找树左下角的值-力扣(LeetCode)讲解链接:代码随想录 求最后一行最后一个左子节点的值就是求二叉树深度最大的叶子节点递归:确定递归函数的参数和返回值参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。这里......
  • 代码随想录算法训练营第四十三天|LeetCode300.最长递增子序列、LeetCode674.最长连续
    前言打卡代码随想录算法训练营第49期第四十三天 (๑ˉ∀ˉ๑)首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode300......
  • 代码随想录:用栈实现队列
    代码随想录:用栈实现队列主要是记一下栈和队列的定义和基本使用方法,值得注意的是pop和push都是操作,没有返回值,需要先用top和front获得顶端的值。这个地方有个记忆技巧,栈只看“顶部顶端”,队列看“前后端”,即top和front-**创建栈**```cppstd::stack<int>s;检查是否为......
  • 代码随想录:用队列实现栈
    代码随想录:用队列实现栈classMyStack{public://pop就是拿队列的最后一个元素,只需要用另一个队列对现有队列遍历,拿到最后一个元素即可queue<int>target;MyStack(){}voidpush(intx){target.push(x);}intp......
  • 代码随想录day14 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 1
    226.翻转二叉树前序和后序写法都可以我用的是前序错误写法classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnnull;swap(root.left,root.right);invertTree(root.left);invertTree(root.r......
  • 代码随想录算法训练营第二十五天|491.递增子序列、46.全排列、47。全排列ii。
    491.递增子序列1.递归传参:多加一个startIndex来控制每次递归起始位置即可。2.终止条件:其实可以不加终止条件,因为startIndex每次都会+1,不会无线递归,但是题目要求子序列大小至少为2,所以size>2就行。3.单层搜索逻辑:如下图,同一父节点下的同层上的元素使用过就不能再使用了。......
  • 代码随想录算法训练营第三十八天|leetcode322. 零钱兑换、leetcode279.完全平方数、le
    1leetcode322.零钱兑换题目链接:322.零钱兑换-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之完全背包,装满背包最少的物品件数是多少?|LeetCode:322.零钱兑换哔哩哔哩bilibili思路:感觉跟之前的方法思路差不多,就是对dp初始化的时候,我开始弄错了,应该初始成无限大,对dp[......
  • 代码随想录第五十二天
    101.孤岛的总面积题目描述给定一个由1(陆地)和0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆......
  • 代码随想录第五十一天
    99.岛屿数量题目描述给定一个由1(陆地)和0(水)组成的矩阵,你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成,并且四周都是水域。你可以假设矩阵外均被水包围。输入描述第一行包含两个整数N,M,表示矩阵的行数和列数。后续N行,每行包含M个数字,数字为......