动态规划之寻找编辑距离

废话少说:上代码

 1 /*此程序实现功能:输入两串字符s1,s2,求出其编辑距离。编辑距离:表示插入一个字符,删除一个字符,替换一个字符使得一个字符串和另一个字符串相等,三种操作分别表示1*/
 2 /*算法思想:动态规划*/
 3 #include<iostream>
 4 #include<string>
 5 using namespace std;
 6 template <typename T> T min(T a, T b, T c) {
 7     if (a < b&&a < c)
 8         return a;
 9     else
10         if (b < c)
11             return b;
12         else
13             return c;
14 }
15 int EditDistance(string s1, string s2);//求编辑距离
16 int main() {
17     string s1 , s2;
18     cout << "请输入字符串s1:";  cin >> s1; cout << endl;
19     cout << "请输入字符串s2:";  cin >> s2; cout << endl;
20     cout << "s1与s2的编辑距离是:" << EditDistance(s1, s2) << endl;
21     //delete s1, s2;
22 }
23 int EditDistance(string s1, string s2) {
24     //m[|s1|][|s2|]是一个二维数组,矩阵第i行第j列的元素保存的是s1的前i个字符和s2的前j个字符的编辑距离
25     // 分配行指针数组
26     int x = 0;
27     int **m = new int*[s1.length() + 1];
28     // 分配列指针数组
29     for (int i = 0; i < s1.length() + 1; i++) {
30         m[i] = new int[s2.length() + 1];
31         //初始化,将数组的第一列每行设为对应的值,即假设s2是一个空串
32         m[i][0] = i;
33     }
34     //初始化,将数组的第一列每行设为对应的值,即假设s2是一个空串
35     for (int j = 0; j < s2.length() + 1; j++)
36         m[0][j] = j;
37     //动态规划核心算法:min中的三个参数分别表示在s1中替换一个,插入一个和在s2中插入一个(即在s1中删除一个)的操作
38     for (int i = 1; i < s1.length() + 1; i++) {
39
40         for (int j = 1; j < s2.length() + 1; j++) {
41             x = 0;
42             if (s1[i - 1] != s2[j - 1])
43                 x = 1;
44             m[i][j] = min<int>(m[i - 1][j - 1] + x, m[i - 1][j] + 1, m[i][j - 1] + 1);
45         }
46     }
47     x = m[s1.length()][s2.length()];
48     for (int i = 0; i < s1.length() + 1; i++)
49         delete[] m[i];
50     return x;
51 }
时间: 2024-08-08 05:36:44

动态规划之寻找编辑距离的相关文章

算法题目: 动态规划 之 最短编辑距离

问题: 对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和.2个非空格字符的距离是它们的ASCII码之差的绝对值:空格与空格的距离为0,空格与其他字符的距离为一个定值k.在一般情况下,字符串A和B的长度不一定相同.字符串A的扩展是在A中插入若干空格字符所产生的字符串.在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离.对于给定的字符串A和B,设计一个算法,计算其扩展距离. 测试数据: 输入:cmc      snmn        2   

动态规划之最小编辑距离问题

       先说点题外话,早上同学给我了一套卷子,让我做,他对象的机试题,第一题是求点队中的最小距离点对,没说数据量,那肯定直接暴力就行了(有给分点,正确输入给5分,什么什么给五分),或者分治算法(编程之美里的):第二题是替换字符串:第三题是求给出的四边形的面积,逼着认为这个不能用海伦公式,因为可能是凹四边形,需要向量公式.题目如此简单,这就是北邮,这种题目能考察出来水平么,哎,或许真是考研的学生水平都不高,只是会看书会考试而已.        昨天上午去市区,媳妇给我买了一个摇头草种子,今天

动态规划经典例子——编辑距离问题

问题描述: 两个字符串,一个是起点字符串,另一个是终点. 例如,起点字符串ddl到终点字符串de的转换步骤如下: ddl->del->def. 编辑距离为2. 算法分析: 首先考虑上面例子中ddl的第一个字符和def的第一个字符,它们是一样的,所以只需要计算a[2...lengthA]和b[2...lengthB](dl和ef)之间的距离即可. 若两个字符串的第一个字符不同,例如adl和def,可以三选一: 把终点串的第一个字符插入到起点串的第一个字符之前(adl->dadl),然后计算

8.动态规划(1)——字符串的编辑距离

动态规划的算法题往往都是各大公司笔试题的常客.在不少算法类的微信公众号中,关于“动态规划”的文章屡见不鲜,都在试图用最浅显易懂的文字来描述讲解动态规划,甚至有的用漫画来解释,认真读每一篇公众号推送的文章实际上都能读得懂,都能对动态规划有一个大概了解. 什么是动态规划?通俗地理解来说,一个问题的解决办法一看就知道(穷举),但不能一个一个数啊,你得找到最优的解决办法,换句话说题目中就会出现类似“最多”.“最少”,“一共有多少种”等提法,这些题理论上都能使用动态规划的思想来求解.动态规划与分治方法类似

dp 动态规划 hdu 1003 1087

动态规划就是寻找最优解的过程 最重要的是找到关系式 hdu 1003 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意:求最大字序列和,其实就是分成 以0结尾的序列 以1结尾的序列 以2结尾的序列 ... 以n结尾的序列 所以以n结尾的序列的最大值就是以n-1结尾的序列的最大值+n的值 或最大值是n的值 关系式: d[i]=max(d[i-1]+a[i],a[i]) d[i]为以i结尾的序列和的最大值,a[i]为第i个数的值 #in

算法:动态规划

1.首先来看看维基百科怎么定义的动态规划 引自wiki:Dynamic programming In mathematics, management science, economics, computer science, and bioinformatics, dynamic programming (also known as dynamic optimization) is a method for solving a complex problem by breaking it dow

【转】什么是动态规划?动态规划的意义是什么

https://www.zhihu.com/question/23995189 徐凯强 Andy 永远好奇 赵劼 . 空明流转 等 1818 人赞同了该回答 动态规划中递推式的求解方法不是动态规划的本质. 我曾经作为省队成员参加过NOI,保送之后也给学校参加NOIP的同学多次讲过动态规划,我试着讲一下我理解的动态规划,争取深入浅出.希望你看了我的答案,能够喜欢上动态规划. 0. 动态规划的本质,是对问题状态的定义和状态转移方程的定义.引自维基百科 dynamic programming is a

基于并行化的神经网络和复旦中文语料库,构建中文概率语言模型

本文旨在基于复旦中文语料库和神经网络模型构建中文的概率语言模型. 统计语言模型的一个目标是找到句子中不同词汇的联合分布,也就是找到一个单词序列出现的概率,一个训练好的统计语言模型可以被应用于语音识别.中文输入法.机器翻译等领域.在神经网络方法被提出之前,一个非常成功的构建语言模型的方法是 n-gram,n-gram 模型学习出统计出给出特定的单词序列时某个单词出现的条件概率,并且通过把一系列重叠的短语拼接起来,获得了模型的泛化能力.然而 n-gram 模型也有很多不如人意的地方.第一, n 的数

A*算法、导航网格、路径点寻路对比(A-Star VS NavMesh VS WayPoint)

在Unity3d中,我们一般常用的寻路算法: 1.A*算法插件 与贪婪算法不一样,贪婪算法适合动态规划,寻找局部最优解,不保证最优解.A*是静态网格中求解最短路最有效的方法.也是耗时的算法,不宜寻路频繁的场合.一般来说适合需求精确的场合. 与启发式的搜索一样,能够根据改变网格密度.网格耗散来进行调整精确度. 使用较好的地方: a.策略游戏的策略搜索 b.方块格子游戏中的格子寻路 2.U3D自带的导航网格系统 U3D内置了NavMesh导航网格系统,一般来说导航网格算法大多是"拐角点算法"