LeetCode-[动态规划]-最小编辑距离

并没有动态规划的基础,所以这里要补充自己理解的动态规划。分为三步:

  1. 什么是动态规划
  2. 理解这道题目,什么是最小编辑距离的算法
  3. 代码怎么写

1. 什么是动态规划

动态规划和递归关系密切,都是大问题转化成小问题

但是有区别:递归有大量重复的步骤,而动态规划则将重复的步骤的结果记录下来,以后遇到重复的步骤就直接用结果而不重复执行步骤,这样就大量减少了时间复杂度

1. 动态规划状态方程经常长这样

  • f[i][j] = f[i - 1][j] + f[i][j - 1]

  • f[i] = max{f[j] if j < i and …} + 1

  • f[i][j] = f[0][j - 1] && judge(1,i) || f[1][j - 1] && judge(2,i) || …

2. 动态规划常见类型

  • 矩阵型

  • 序列型

  • 双序列型

  • 划分型

  • 区间型

  • 背包型

  • 状态压缩型

  • 树型

3. 什么问题该用动态规划

  • 求最大值/最小值

  • 求可不可行

  • 求方案总数

如果你碰到一个问题,是问你这三个问题之一的,那么有90%的概率是使用动态规划来求解。

要重点说明的是,如果一个问题让你求出“所有的”方案和结果,则肯定不是使用动态规划。

4. 解决动态规划的步骤

  • 状态是什么

  • 状态转移方程是什么

  • 状态的初始值是什么

  • 问题要求的最后答案是什么

每个步骤分析完成之后,就基本上解决了整道动态规划的问题。

动态规划主要是一种“大化小”的思想,了解到这种程度就差不多了,接下来都要靠练习找感觉。

2. 最小编辑距离

我觉得这篇文章写得较好,动态规划零基础的我也能看懂。以下参考了这篇文章。
https://blog.csdn.net/qq_34552886/article/details/72556242

1. 最小编辑距离含义

编辑距离算法被数据科学家广泛应用,是用作机器翻译和语音识别评价标准的基本算法。
字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出。是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数。

输入: word1 = “horse”, word2 = “ros”
输出: 3
解释:
horse -> rorse (将 ‘h’ 替换为 ‘r’)
rorse -> rose (删除 ‘r’)
rose -> ros (删除 ‘e’)

两个字符串的编辑距离越小,则它们越相似

如果两个字符串相等,则它们的编辑距离为0。

不难分析出,两个字符串的编辑距离肯定不超过它们的最大长度(可以通过先把短串的每一位都修改成长串对应位置的字符,然后插入长串中的剩下字符)。


2. 最小编辑距离三种操作

	写在前面:
	word1是可变的,word2是不可变的。即插入、删除、替换是针对可变的字符串说的,看到其他文章时
	要注意它是word1可变还是word2可变。
	比如下面将要讲到的(其中 j 对应可变字符串):edit[i-1][j]表示插入,而不是删除
	                                      edit[i][j-1]表示删除,而不是插入

分别给串1和串2设两个指针 i ,j,分别遍历两个串,遍历过程中只会执行以下三种操作:

  • 插入
  • 删除
  • 替换:替换包括真的替换一个字符,另一个是若两个串比对的字符一样则同时跳过

在这里插入图片描述


3. 状态方程

用edit[i][j]表示A串和B串的编辑距离。edit[i][j]表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。

dis[0][0]表示word1和word2都为空的时候,此时他们的Edit Distance为0。很明显可

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值