码迷,mamicode.com
首页 > 其他好文 > 详细

编辑距离

时间:2019-11-19 17:34:12      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:操作   技术   info   ==   思想   图片   elf   部分   字符   

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

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

  插入一个字符
  删除一个字符
  替换一个字符

代码实现:

 1 # 编辑距离
 2 class Solution:
 3     def minDistance(self, word1: str, word2: str) -> int:
 4         m = len(word2)
 5         n = len(word1)
 6         mem = [[0 for col in range(m + 1)] for row in range(n + 1)]
 7         for i in range(n + 1):
 8             mem[i][0] = i
 9         mem[0] = [i for i in range(m+1)]
10         for row in range(1, n+1):
11             for col in range(1, m+1):
12                 if word1[row-1] == word2[col-1]:
13                     mem[row][col] = 1 + min(mem[row-1][col], mem[row][col-1],mem[row-1][col-1]-1)
14                 else:
15                     mem[row][col] = 1 + min(mem[row-1][col], mem[row][col-1],mem[row-1][col-1])
16         return mem[-1][-1]

  算法原理:

  技术图片

 

   蓝色边界:列为word1子序列转换为空所需要的操作次数;行为空序列转换为word2的子序列需要的次数;

  计算步骤:

  技术图片

 

  技术图片

 

  技术图片

 

  技术图片

 

  算法思想:

  红色部分注意,min函数里面最后一项减去了1;为什么要这样操作呢?这是因为在等式的右边第一项就是1,而这个1表示不管min函数取到什么都要进行一次操作:当取到mem[i-1,j]表示要删除word1中新加入的字符mem[i-1,j]已经可以将子序列转化为word2的目标子序列;当取mem[i,j-1]时,则为插入一个word2新加入子序列的字符;当取mem[i-1,j-1]时,可以将word1加入的元素替换为word2加入的元素。三种情况都是一步操作得到mem[i,j],但是我们应该注意到两个单词新加入的字符不会影响删除和插入操作,对替换却有很大的影响,若两个字符相同,我们根本不需要替换操作,所以当两个字符相同时,mem[i-1,j-1]要先减去1,因为在前面为了形式统一已经加过1了。

编辑距离

标签:操作   技术   info   ==   思想   图片   elf   部分   字符   

原文地址:https://www.cnblogs.com/dan-baishucaizi/p/11890399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!