编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
 
Input
第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Input示例
kitten
sitting
Output示例
3
解:
具体介绍:https://www.51nod.com/tutorial/course.html#!courseId=3
我们以矩阵形式实现了教程中的比较思想。
以字符串dabcd和acdc为例,演示流程:
(第二行与第二列预置,之后的数字由其对应行列字母与上,左,左上数字决定。
  具体操作:首先比较对应行列字母,若一样则填入左上数据,
                   否则填入上,左,左上数字的最小值加一。)

 #include<stdio.h>

 char a[], b[];
int dp[][]; int min(int a, int b, int c)
{
b = b < a ? b : a;
return (c < b ? c : b);
} int main()
{
while (scanf_s("%s%s", a, , b, ) != EOF)
{
int i, j;
for (i = ; i == || a[i - ] != ; i++)
for (j = ; j == || b[j - ] != ; j++)
if (i == || j == ) dp[i][j] = i | j;
else if (a[i - ] == b[j - ]) dp[i][j] = dp[i - ][j - ];
else dp[i][j] = min(dp[i - ][j - ], dp[i - ][j], dp[i][j - ]) + ;
printf("%d\n", dp[i - ][j - ]);
}
return ;
}

由于该方法顺序的检索顺序,我们可以优化空间消耗,减小数组dp的大小:

 #include<stdio.h>

 char a[], b[];
int dp[][]; int min(int a, int b, int c)
{
b = b < a ? b : a;
return (c < b ? c : b);
} int main()
{
while (scanf_s("%s%s", a, , b, ) != EOF)
{
int i, j;
for (i = ; != a[i]; i++) dp[][i + ] = i + ;
for (i = ; != a[i - ]; i++)
{
dp[i & ][] = i;
for (j = ; != b[j - ]; j++)
{
if (a[i - ] == b[j - ]) dp[i & ][j] = dp[i + & ][j - ];
else dp[i & ][j] = min(dp[i & ][j - ], dp[i + & ][j - ], dp[i + & ][j]) + ;
}
}
printf("%d\n", dp[i + & ][j - ]);
}
return ;
}

最新文章

  1. spring加载过程,源码带你理解从初始化到bean注入
  2. Linux初学:(二)Shell环境与命令基础
  3. Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Population]
  4. Intent之复杂数据的传递
  5. Dom 概览
  6. 20145218 《Java程序设计》第9周学习总结
  7. django 学习-16 Django会话Cookie
  8. 搭建Asp.Net MVC4
  9. Kafka笔记--常用指令(删除topic)
  10. poj2253(最短路小变形)
  11. Android对于静默安装和卸载
  12. 每个程序员都应该学习使用Python或Ruby
  13. 用Maven实现一个protobuf的Java例子
  14. 湖南省队集训 Day 2
  15. python基础知识总结(二)
  16. Java笔记Spring(五)
  17. P1705 爱与愁过火(背包)
  18. java spring属性注入
  19. Dubbo(1)--初识Dubbo
  20. BZOJ2957: 楼房重建(分块)

热门文章

  1. HDU 5695 Gym Class
  2. .NET Core 3.0之深入源码理解Configuration(一)
  3. [Bzoj1821][JSOI2010]Group 部落划分 Group(并查集)(二分答案)
  4. JDBC调用存储过程,进参出参
  5. springboot使用过程中遇到的问题
  6. makefile的语法及写法
  7. Ubuntu 16.04安装Fiddler抓包工具(基于Mono,且会有BUG)
  8. openstack ocata 的cell 和 placement api
  9. IOCP实现的任务队列
  10. oracle授权、表备份、用户管理