参考博客: https://github.com/youngwind/blog/issues/106

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符
示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

对于给定的两个单词,如何使得word1经过最少的步骤转换成为word2呢,自己学习了网上的一些解法,对于递归和动态规划,两种方法的实现方式不同,但是基本思想是相同的,基本思想如下:
对于两个单词,如果要将一个单词变换成为另一个单词,那么我们需要考虑对于单词的每一个字母,使其与另一个单词的每一个字母相同,即进行相应的编辑使得这两个字母相同,然后依次对需要编辑的其他字母进行编辑

  • 以 d [ i ] [ j ] 表示 长度为 word1 中长度为i的子串到 word2 中长度为 j 的 子串需要的最小最小的编辑距离
  • 当 i 和 j 分别等于对应字符串的长度时,即d[word1.lenggth()][word2.length()]即为我们所求
  • 对于长度为 i 和长度为 j 的子串,如果两个子串的最后一个字符相等, 即 word1.charAt(i-1)==word2.charAt(j-1)
    那么两个子串的编辑距离 d [ i ][ j ]=d[ i-1 ][ j - 1 ],即等于长度为i-1和长度为j-1的子串的编辑距离, 这个比较好理解,因为相同不用编辑了呀,
  • 当两个子串的最后一个字符不相等的时候,即 word1.charAt(i-1) != word2.charAt(j-1),这个时候我们就需要进行相应的编辑了,
  • 编辑 方法一 : d[ i ] [ j ] = d [ i ] [ j - 1] + 1
  • : 对于字符串abc 和 acd 两个字符串最后一个字符不相等,
  • :可以通过 添加字母的方式, 我们假设添加 d ,则 abc 变为abcd ,
  • : 从abcd 到 acd 的编剧距离即等于 abc 到 ac 的编辑距离,因为d相等,即 d[ i ] [ j ] = d [ i ] [ j - 1] + 1
  • : 其实在这里增加字符和删除 acd 中的 字符 d 的效果时相同的。
  • 编辑 方法二:d [ i ] [ j ] = d [ i - 1] [ j ] + 1
  • : 通过添加字母 c 的方式,则 acd 变为 acdc
  • :从abc 到acd 的编辑距离变为 从 ab 到 acd 的编辑距离,因为c 相等,即 d [ i ] [ j ] = d [ i - 1] [ j ] + 1
  • : 在这里添加字母c 的方式和删除 abc 中字母 c 的效果相同
  • 编辑 方法三 :d[ i ] [ j ] =d[ i - 1] [ j - 1 ] + 1
  • : 通过替换字母的方式 我们可以将 abc 最后字母替换为d 即 abd 到 acd (也可以 abc 到 acc 替换为 c)
  • : 相应的编辑距离变为 d[ i ] [ j [] = d [ i -1 ] [ j - 1] +1
    对于上面的三种变换方式,我们取三个中的最小值取获得相应的最小的编辑距离

在编码求解的过程中

  • 对于动态规划的方法我们需要给出相应的初始值,
  • 对于递归的方法我们需要给出边界值
class 编辑距离 {//递归解法  public static int minDistanceWay1(String word1, String word2) {// 减少重复运算,不然会超时int[][] dis = new int[word1.length() + 1][word2.length() + 1];for (int i = 0; i <= word1.length(); i++) {Arrays.fill(dis[i], -1);}return recursion(word1, word2, word1.length(), word2.length(), dis);}private static int recursion(String word1, String word2, int length1, int length2, int[][] dis) {if (dis[length1][length2] > -1) {return dis[length1][length2];}if (length1 == 0) {return length2;} else if (length2 == 0) {return length1;} else if (word1.charAt(length1 - 1) == word2.charAt(length2 - 1)) {// 两个字符相等的话我们就直接比较前一个字符int distance = recursion(word1, word2, length1 - 1, length2 - 1, dis);dis[length1][length2] = distance;return distance;} else {// 删除字符和添加字符我们达到的效果是一样的// 当两个字符串不相等的时候我们就删除word1的最后一个字符,计算(m-1,n)这两个字符串之间的最短编辑距离int deleteWord1 = recursion(word1, word2, length1 - 1, length2, dis);// 删除word2的最后一个字符int deleteWord2 = recursion(word1, word2, length1, length2 - 1, dis) + 1;// 替换一个word1或者word2中的任意一个字符int replaceWord = recursion(word1, word2, length1 - 1, length2 - 1, dis);int distance = Math.min(Math.min(deleteWord1, deleteWord2), replaceWord) + 1;dis[length1][length2] = distance + 1;return distance;}}//  动态规划解法public static int minDistanceWay2(String word1, String word2) {int lenWord1 = word1.length();int lenword2 = word2.length();// minDis[i][j]表示长度为i和长度为j的单词之间的最小编辑距离int[][] minDis = new int[lenWord1 + 1][lenword2 + 1];for (int i = 1; i <= lenWord1; i++) {minDis[i][0] = i;}for (int j = 1; j <= lenword2; j++) {minDis[0][j] = j;}for (int i = 1; i <= lenWord1; i++) {for (int j = 1; j <= lenword2; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {minDis[i][j] = minDis[i - 1][j - 1];} else {int deleteWord1 = minDis[i - 1][j] + 1;int deleteWord2 = minDis[i][j - 1] + 1;int replaceWord = minDis[i - 1][j - 1] + 1;minDis[i][j] = Math.min(Math.min(deleteWord1, deleteWord2), replaceWord);}}}return minDis[word1.length()][word2.length()];}public static void main(String[] args) {System.out.println(minDistanceWay2("b", ""));System.out.println(minDistanceWay2("dinitrophenylhydrazine", "benzalphenylhydrazone"));}
}```

两个单词之间的编辑距离相关推荐

  1. 随便输入两个单词,两个单词之间以空格隔开,输出时每个单词的首字母变为大写。如输入:“hello java”,输出为“Hello Java”

    话不多说,上代码 @Testpublic void test1(){StringBuilder sb = new StringBuilder();String str = "hello ja ...

  2. sklearn计算两个向量之间的距离

    from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import euc ...

  3. 每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布

    Text Justification 原题链接Text Justification 将以这个字符串数组重组成几行,每个字符串用空格分隔,要求 每行的长度相同 每行的空格需要均匀分配,且每个单词之间至少 ...

  4. 如何计算两个字符串之间的文本相似度?

    如何计算两个字符串之间的文本相似度? 前言 平时的编码中,我们经常需要判断两个文本的相似性,不管是用来做文本纠错或者去重等等,那么我们应该以什么维度来判断相似性呢?这些算法又怎么实现呢?这篇文章对常见 ...

  5. 查找两个单词链表共同后缀的起始结点(C++,单链表/双向链表解法)

    描述 假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间.例如,"loading"和"being"的存储映像如下图所示: 设st ...

  6. 计算两个字符串之间的相似度

    1.jaccard相似度:字符级别--相同字符的个数占总字符的个数 参考文档:https://blog.csdn.net/u012836354/article/details/79103099 只是衡 ...

  7. C语言编程>第十周 ⑦ 请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行……

    例题:请编写函数fun,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回.一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开,一行的开始和结尾都没有空格. 请勿改 ...

  8. [C语言]统计单词:输入一行字符(其中仅包含英文字母和空格),用函数编程统计其中有多少单词。假设单词之间以空格分开。

    输入 输入一行字符(其中仅包含英文字母和空格),并且长度不超过20. 输出 输出单词数量,单词之间以空格分开. 输入示例 I am a student 输出示例 4 数据范围 输入为字符串,并且长度不 ...

  9. 使用互信息来衡量两个单词间的相关程度

    \quad两个随机变量X,YX,YX,Y的互信息为I(X;Y)=∑x∈X,y∈Yp(x,y)logp(x,y)p(x)p(y)I(X;Y)=\sum_{x\in X, y\in Y}p(x,y)log ...

最新文章

  1. python图形缝隙填充_Python,如何缝合图像哪些重叠区域?
  2. 2月第二周.COM增近12万 ×××域名.XXX减122个
  3. 用ruby的net/ssh链接远程的服务器
  4. 【企业管理】围绕价值创造开展人力资源管理
  5. LeetCode 5. 最长回文子串(动态规划)
  6. UVA 10886 Standard Deviation
  7. mysql处理重复数据
  8. VB判断指定名字的进程是否存在函数
  9. Ext3和Ext4文件系统
  10. Linux oracle中文乱码的问题解决
  11. 小宇飞刀与xieyunc
  12. LINUX下载编译libspeex/libspeexdsp
  13. 《信号与系统》(吴京)部分课后习题答案与解析——第二章(PART2)
  14. 在线图片文字识别html,识别文字在线_识别图片文字的在线方法是什么?
  15. CodeForces 643 D.Bearish Fanpages(set+multiset)
  16. 谈谈产品与运营之 - 润物细无声
  17. 考研英语复试口语常见问题(上岸必备)
  18. [wine5.0] 解决wine所有软件乱码(中文不显示)问题
  19. 中国探月工程首席科学家欧阳自远:“嫦娥”月面图千真万确
  20. org.springframework.core.type.AnnotationMetadata.introspect(Ljava/lang/Class;)Lorg/springframework/c

热门文章

  1. 【CozeTalk】关于“富人思维”
  2. 一些关于CV和deeplearning的干货链接(长期更新)
  3. hdmi网线延长器稳定吗_Chromecast HDMI延长器的重点是什么? 我需要吗?
  4. 基于STM32指纹密码锁设计
  5. 《听读书怪才解读24部名人传记》笔记
  6. mfc入门基础(四)对话框添加控件、创建对话框类和为对话框控件添加变量
  7. 【伪大数据】对QQ空间指定好友2017年说说数据的分析
  8. 别再无脑get、set了,快使用lombok,从此不用再get、set
  9. poi获取excel打印标题行与表头,itext生成pdf设置打印标题行与表头
  10. 乐视电视连无线服务器异常,乐视电视怎么连网 有线连接or无线连接任选