概述

Levenshtein Distance是一个度量两个字符序列之间差异的字符串度量标准,两个单词之间的Levenshtein Distance是将一个单词转换为另一个单词所需的单字符编辑(插入、删除或替换)的最小数量。Levenshtein Distance是1965年由苏联数学家Vladimir Levenshtein发明的。Levenshtein Distance也被称为编辑距离(Edit Distance)。

定义

对于两个字符串、,长度分别为、,它们的Levenshtein Distance 为:

其中当时,为0,否则为1。就是的前个字符与的前个字符的编辑距离。

、的相似度为。

原理

首先考虑极端情况,当或长度为0时,那么需要编辑的次数就是里一个字符串的长度。

然后再考虑一般情况,此时分为三种情况:

在k个操作中,将a[1...i]转换为b[1...j-1]
在k个操作中,将a[1...i-1]转换为b[1...j]
在k个操作中,将a[1...i-1]转换为b[1...j-1]
针对第一种情况,只需要在a[1...i]后加上字符b[j],即可完成a[1..i]到b[1...j]的转换,总共需要的编辑次数即为k+1。

针对第二种情况,只需要在a[i]字符从a中移除,即可完成a[1..i]到b[1...j]的转换,总共需要的编辑次数即为k+1。

针对第三种情况,只需要将a[i]转换为b[j],即可完成a[1..i]到b[1...j]的转换,如果a[i]与b[i]的字符相同,则总共需要的编辑次数为k,否则即为k+1。

所以上述三种情况分别对应于插入、删除、替换操作。

为了保证将a[1..i]转换为b[1..j]的操作数总是最少的,只需要从三种情况中选择操作次数最少的情况,同理为了保证三种情况的操作数也是最小的,只需要按此逻辑进行迭代保证每一步的操作数都是最小的即可。

示例

为方便理解,以字符串:abroad和:aboard为例,将求值过程中每一步的操作数放入一个i+1行j+1列的二维数组中, 即为将a[1..i]转换为b[1...j]所需要的最少的操作数。

1.首先是极端情况,即d[0][j]、d[i][0]即a为空字符串或b为空字符串时,需要操作的次数即为另一字符串的长度。

2.然后是一般情况,即d[i][j]的值,遍历这个二维数组,从第一行开始直到最后一行,由定义可知d[i][j]的值为d[i-1][j]+1、d[i][j-1]+1以及d[i-1][j-1]+1(如果a[i]==b[j])的最小值。即根据d[i][j]所在位置的正上方(d[i-1][j])、左方以(d[i-1][j])及左上方(d[i-1][j-1])的值计算出d[i][j]的值,由此得到二维数组中所有元素的值。

3.最后的d[i][j]即为字符串a转换为b的最少操作数。

求值过程如下图:


Levenshtein Distance
如图字符串、的Levenshtein Distance 为2,相似度为:

代码:

#include <bits/stdc++.h>
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
using namespace std;
char a[1005],b[1005];
int f[1005][1005],n,m;
int main(){scanf("%s%s",a+1,b+1);n=strlen(a+1);m=strlen(b+1);int w=max(n,m);for(int i=1;i<=w;++i)f[i][0]=f[0][i]=i;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){if(a[i]==b[j])f[i][j]=f[i-1][j-1];else f[i][j]=min(f[i][j-1],min(f[i-1][j],f[i-1][j-1]))+1;}}printf("%d",f[n][m]);return 0;
}
---------------------
原文:https://blog.csdn.net/jmsyzsfq/article/details/78369002

--------------------- 
原文:https://blog.csdn.net/asty9000/article/details/81384650 
版权声明:本文为博主原创文章,转载请附上博文链接!

【动态规划】字符串编辑距离(Levenshtein距离)算法相关推荐

  1. 编辑距离算法和Levenshtein距离算法

    前言 最近在研究diff工具的实现,已经写了一个简单的demo,不过目前这个demo只是把Levenshtein距离算法的结果用Qt可视化了出来而已,还没有实用价值,界面如下: 各种diff工具的核心 ...

  2. 详细剖解Levenshtein距离算法(附python实现)

    在实习期间,看到同事在做文字识别的相关项目,用Levenshtein距离作为评价模型好坏的标准之一.由于是行外人,当时对这个算法并没有任何了解,只听他介绍是用来判断两个字符是否相似的一种指标吧,直到后 ...

  3. 基因序列算法:编辑距离( Levenshtein 距离)和LD算法

    一. Levenshtein 距离 许多基因算法(如Wagner-Fischer 算法)基于以下观察计算编辑距离:如果我们构造一个矩阵来保存第一个字符串和第二个字符串的所有前缀,以及所有前缀之间的编辑 ...

  4. 编辑距离算法详解:Levenshtein Distance算法——动态规划问题

    目录 背景: 求编辑距离算法: 图解过程: C++代码如下: 总结: 背景: 我们在使用词典app时,有没有发现即使输错几个字母,app依然能给我们推荐出想要的单词,非常智能.它是怎么找出我们想要的单 ...

  5. 编辑距离及编辑距离算法 | Levenshtein距离 |DP

    感谢:http://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html 加一点自己理解 编辑距离概念描述: 编辑距离,又称Leven ...

  6. Levenshtein Distance算法(编辑距离算法)

    编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...

  7. 动态规划 —— 线性 DP —— 字符串编辑距离

    [概述] 字符串编辑距离,即 Levenshtein 距离,是俄国科学家 Vladimir Levenshtein 提出的概念,是指从一个字符串修改到另一个字符串时,编辑单个字符所需的最少次数,编辑单 ...

  8. python 编辑距离_编辑距离(Levenshtein距离)详解(附python实现)

    编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如 ...

  9. 字符串相似度算法——Levenshtein Distance算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  10. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

最新文章

  1. Pytorch中的数据加载
  2. 窗口缩放导致页面排版错乱的解决方法
  3. String.slice和String.substring有什么区别?
  4. My Linux 让人高兴的新进展(博客搬家 2007-07-14 13:05)
  5. .NET 机器学习生态调查
  6. 2.2使用urllib的简单传输
  7. KeilC51基础 改变代码的字体大小
  8. 可以实现树形结构的设计模式(组合模式)
  9. Android百度地图+OSS图片拍照上传+导航+idea
  10. LFY-SpringBoot2【SpringBoot2入门】
  11. 深度学习_07_2_随机梯度下降_激活函数及梯度损失函数及梯度
  12. 百度地图离线开发demo(热力图)
  13. 数字化的一切都会在安全沙箱里面
  14. 将一个整数分解为质数的乘积的实现方式
  15. 一枚程序员的跑步之路
  16. c/c++编译器配置(交叉编译重要参数)、交叉编译动态库与as配置、mk初步
  17. 廖雪峰python教程学习之习题解析
  18. 第一部分:简单句——第一章:简单句的核心——一、简单句的核心构成
  19. 最好用的Android反编译、重新编译和签名工具-AntiDroid V1.3 发布了~
  20. 免费OA系统平台在企业发展中的优势(转载)

热门文章

  1. 【ABC 132 E】Hopscotch Addict(最短路)
  2. 华为手机NFC模拟加密的门禁卡详细教程
  3. 小心利用大家的爱国热情来传播Worm.Win32.AutoRun.dgk的网页
  4. c语言怎么判断编码,C语言中判断一个char*是不是utf8编码
  5. lammps+colvars计算PMF
  6. 狗年拜年php源码,2018新年拜年贺词【2018狗年拜年贺词】
  7. 强制跳过WM调整屏幕的方法
  8. 物联网芯片+区块链底层融合:紫光展锐开创产业升级新思路
  9. solidworks创新作业无限魔方
  10. 微带贴片天线的分析方法-空腔模型法