编辑距离,又称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为例,演示流程:(第二行与第二列预置,之后的数字由其对应行列字母与上,左,左上数字决定。   具体操作:首先比较对应行列字母,若一样则填入左上数据,                   否则填入上,左,左上数字的最小值加一。)

 1 #include<stdio.h>
 2
 3
 4 char a[1005], b[1005];
 5 int dp[1005][1005];
 6
 7 int min(int a, int b, int c)
 8 {
 9     b = b < a ? b : a;
10     return (c < b ? c : b);
11 }
12
13 int main()
14 {
15     while (scanf_s("%s%s", a, 1005, b, 1005) != EOF)
16     {
17         int i, j;
18         for (i = 0; i == 0 || a[i - 1] != 0; i++)
19             for (j = 0; j == 0 || b[j - 1] != 0; j++)
20                 if (i == 0 || j == 0) dp[i][j] = i | j;
21                 else if (a[i - 1] == b[j - 1]) dp[i][j] = dp[i - 1][j - 1];
22                 else dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
23         printf("%d\n", dp[i - 1][j - 1]);
24     }
25     return 0;
26 }

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

 1 #include<stdio.h>
 2
 3
 4 char a[1005], b[1005];
 5 int dp[2][1005];
 6
 7 int min(int a, int b, int c)
 8 {
 9     b = b < a ? b : a;
10     return (c < b ? c : b);
11 }
12
13 int main()
14 {
15     while (scanf_s("%s%s", a, 1005, b, 1005) != EOF)
16     {
17         int i, j;
18         for (i = 0; 0 != a[i]; i++) dp[0][i + 1] = i + 1;
19         for (i = 1; 0 != a[i - 1]; i++)
20         {
21             dp[i & 1][0] = i;
22             for (j = 1; 0 != b[j - 1]; j++)
23             {
24                 if (a[i - 1] == b[j - 1]) dp[i & 1][j] = dp[i + 1 & 1][j - 1];
25                 else dp[i & 1][j] = min(dp[i & 1][j - 1], dp[i + 1 & 1][j - 1], dp[i + 1 & 1][j]) + 1;
26             }
27         }
28         printf("%d\n", dp[i + 1 & 1][j - 1]);
29     }
30     return 0;
31 }

转载于:https://www.cnblogs.com/Ekalos-blog/p/9863789.html

(DP)51NOD 1183 编辑距离相关推荐

  1. 51Nod - 1183 编辑距离

    问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符 解析: 首先定义这样一个函数--edit(i, j),它表示第 ...

  2. 【HDU - 1080】Human Gene Functions(dp,可编辑距离类问题)

    题干: 给你两个DNA序列(长度不一定相同),你可以在其中任意位置上加入空格,使得最终他俩长度相同,最终相同长度的两个DNA序列会有个相似度比较(每个字符相对应的比较),问你如何放置这些空格使得总相似 ...

  3. LeetCode 712. 两个字符串的最小ASCII删除和(DP,类似编辑距离)

    1. 题目 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...

  4. DP问题从入门到精通2.2(线性DP,最短编辑距离)

    DP入门到精通系列 DP问题入门到精通1 DP问题入门到精通2.1 DP问题入门到精通3 DP问题入门到精通4 DP问题从入门到精通5 dp问题的难点到底是什么呢? 我认为是如何写出dp的更新方式,还 ...

  5. LeetCode 72. 编辑距离(DP)

    1. 题目 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示 ...

  6. 51nod 基础题题解(全)

    基础题(40): 1000 A + B 1005 大数加法 1006 最长公共子序列Lcs 1018 排序 1019 逆序数 1027 大数乘法 1046 A^B Mod C 1057 N的阶乘(大数 ...

  7. 代码随想录算法训练营Day56动态规划:583.两个字符串的删除操作,72.编辑距离

    583.两个字符串的删除操作 文章链接:代码随想录 (programmercarl.com) 思路:动规五步曲 (1)确定dp数组及其含义 dp[i][j]表示字符串1在区间[0, i - 1]和字符 ...

  8. LeetCode 583. 两个字符串的删除操作(动态规划)

    1. 题目 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例: 输入: "sea" ...

  9. LeetCode 1143. 最长公共子序列(动态规划)

    1. 题目 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度. 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符 ...

最新文章

  1. java 模拟实现mq,RabbitMQ的5种模式,并使用java进行模拟操作
  2. Python - - 项目实战 -- pygame 快速入门
  3. [ZT]国家颁布防沉迷系统 网游三小时后经验减半
  4. java基础集合类之set
  5. 如何申请到利息低的贷款?
  6. Fast Image Cache – iOS 应用程序高性能图片缓存
  7. 使用Oracle做定时任务
  8. Linux系统有od程序吗,Linux od命令
  9. QGhappy小组第三次作业第二天完成情况
  10. java pppoe_ADSL(PPPOE)接入指南
  11. 抱歉,我也不知道程序员35岁以后该怎么办!
  12. 蔡康永的201堂情商课
  13. Java Web中Forward和redirect的区别
  14. bootstrap中固定table的表头
  15. 安装taro踩到小坑
  16. 极光开发者周刊【No.0806】
  17. 192-神以恩典为你年岁的冠冕
  18. 单页面应用和多页面应用
  19. 共赴数智金融未来,2023数智金融峰会即将召开
  20. 【Window10】解决win10家庭中文版找不到组策略gpedit.msc修改不了C盘文件

热门文章

  1. 性别从后台获取得值的那点事儿
  2. jquerynbsp;easyuinbsp;dateboxnbsp;的使用nbsp;.
  3. 如何通过代码注册或取消事件?
  4. 滑动门和翻转门实现的横竖双tab标签测试页面(附源码)
  5. 概述HTML文档的基本结构,HTML概述与基本结构
  6. kindeditor上传图片php,Kindeditor编辑器添加图片上传水印功能(php代码)
  7. python 手动读取cifar10_Python读入CIFAR-10数据库
  8. html缩进快捷键_HTML 入门笔记
  9. like mysql 相反_mysql真的不能做搜索引擎吗?
  10. matlab 转动惯量 叠加,一种汽车动力总成系统转动惯量合成方法