编辑距离,又称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 ;
}

(DP)51NOD 1183 编辑距离的更多相关文章

  1. 51nod 1183 编辑距离(dp)

    题目链接:51nod 1183 编辑距离 #include<cstdio> #include<cstring> #include<algorithm> using ...

  2. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  3. 51nod 1183 编辑距离【线性dp+类似最长公共子序列】

    1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...

  4. 51nod 1183 编辑距离

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183. 题意不再赘述. 分析:大概和LCS差不多的吧   但是我用LCS ...

  5. 51Nod 1183 编辑距离 (字符串相似算法)

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

  6. 51NOD 1183编辑距离(动态规划)

    >>点击进入原题测试<< 思路:这个题放在基础题,分值还是零分,好歹也给人家动态规划一点面子啊!刚开始写的想法是找到其最大公共字串,然后用两个字符串中最长字符串的长度减掉最大公 ...

  7. 动态规划 51nod 1183

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 1183 编辑距离  基准时间限制:1 秒 空间限制:1 ...

  8. 51 Nod 1183 编辑距离 (动态规划基础)

    原题链接:1183 编辑距离 题目分析:这个最少的操作次数,通常被称之为编辑距离."编辑距离"一次本身具有最短的意思在里面.因为题目有"最短"这样的关键词,首先 ...

  9. POJ 3356 AGTC(DP求字符串编辑距离)

    给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案 ...

随机推荐

  1. java基础 3 Object通用方法(1)

    Object通用方法(1) clone: 浅复制    被复制对象的所有变量都含有与原对象相同的值,而所有对其他对象的引用仍然指向原来的对象,换言之,浅复制仅仅复                   ...

  2. Maven创建项目时出现Generating project in Interactive mode就一直卡住的解决方案

    使用maven命令在创建项目的时候出现 Generating project in Interactive mode 然后就一直卡住 网上搜做了很多解决方案 有说各种方案的,最后找到了一种.实验成功 ...

  3. 【stl学习笔记】deques

    deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似.deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map ...

  4. Android中AsyncTask使用具体解释

    在Android中我们能够通过Thread+Handler实现多线程通信.一种经典的使用场景是:在新线程中进行耗时操作.当任务完毕后通过Handler向主线程发送Message.这样主线程的Handl ...

  5. android POI搜索,附近搜索,周边搜索定位介绍

    POI搜索有三种方式.依据范围和检索词发起范围检索poiSearchInbounds.城市poi检索poiSearchInCity,周边检索poiSearchNearBy. 下以周边检索为例介绍怎样进 ...

  6. ansible学习之--简单学习笔记1

    1.利用dm-crypt来创建加密文件系统.编写shell脚本(安装和卸载两个shell脚本) 2.编写ansible,playbook文件 3.编写python脚本 首先编写shell脚本 inst ...

  7. LoadRunner系列之—-03 用Java Vuser协议编写接口测试脚本

    待测试接口用java语言实现,且项目中调用该接口需要用专门的jar包.这种情况可以用Java Vuser协议实现接口调用脚本,类似java代码. 代码样例如下: /* * LoadRunner Jav ...

  8. [Sciter] 1. 创建最简单的Sciter项目

    一些函数 sciter::debug_output_console _; 程序运行时自动启动一个控制台窗口,通过在_tiscript_中调用stdout.println来输出调试信息 SciterSe ...

  9. linux epoll的实现原理

    1 linux的poll操作 linux文件的poll操作有两个主要目的:第一,主动查看该文件上是否有读写事件:第二,提供操作waitqueue的接口给epoll等上层接口使用,比如epoll可以通过 ...

  10. Golang1.8编译静态库给C使用

    Go实例代码: package main import ( "fmt" ) import "C" //export Printf func Printf(for ...