动态规划——最短编辑距离

编辑距离是指两个字串之间,从一个转成另一个所需要的最少编辑操作次数,许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 
问题 
    给定两个字符串S1和S2,求S2和S1的编辑距离,即至少需要经过多少步编辑操作才可以将S1变成S2。

分析 
    定义“状态” edit[i][j],表示将S1的长度为i的前缀S1[1...i]到S2的长度为j的前缀S2[1....j]的编辑距离。则显然有:

if (i == 0 && j == 0)
    edit[i][j] = 0;
else if (i == 0 && j > 0)
    edit[i][j] = j;
else if(j == 0 && i > 0)
    edit[i][j] = i;
else
    edit[i][j] = min{edit[i-1][j] + 1, edit[i][j-1] + 1, edit[i-1][j-1] + f(i, j)}
//其中,当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1; 否则 = 0.
时间: 2024-10-10 10:28:38

动态规划——最短编辑距离的相关文章

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

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

最短编辑距离算法

一般情况下,电商在当客户输入一个不存在的商品时,会返回客户一个与客户输入最为接近的商品,并加以提示"您是不是在找XXX?".这其中用到了一种算法,叫做"最短编辑距离算法",能在一大堆已存在的字符串中找到与原字符串最为接近的那个字符串,称之为最短编辑距离. 这种算法是基于动态规划思想,下面是算法的思路描述: 描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改

最短编辑距离算法实现

一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢?任给两个字符串X 和Y,使用以下三种操作将 字符串X 变到 字符串Y  :①插入(Insert)操作:②删除操作(delete):③替换操作(substitute) 比如 字符串X="intention" ,  字符串Y="execution".从字符串X 转换成 字

最短编辑距离算法(字符串比较)

一.编辑距离 1.从字符串a变为字符串b所需要的元操作有3种: 增加一个字符 删除一个字符 变化一个字符 2.编辑距离:从字符串a变为b所需要的最少操作步骤. 二.最短编辑距离(动态规划) 首先定义一个函数--step(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离. 显然可以有如下动态规划公式: if i == 0 且 j == 0,step(i, j) = 0 if i == 0 且 j > 0,step(i, j) = j if i > 0 且j

最短编辑距离问题理解

最短编辑距离是指两个字符串,把其中一个字符串转为另一个字符串所需要花费的最小操作成本. 设dp[i][j]为Xi与Yj的最短编辑距离,则Xi与Yj处于最优解时的排列有三种情况 1.Xi最后一个元素xi位于Yj最后一个元素yj的左边 2.Xi最后一个元素xi位于Yj最后一个元素yj的右边 3.Xi最后一个元素xi与Yj最后一个元素yj重合 无论最终dp[i][j]的字符串如何对齐,只用取三种情况的最小值即可. 对于1,转化操作时,yj是必然要删掉的,故必然有1个单位的操作成本,因为dp[i][j]

POJ 3356 AGTC 最短编辑距离 DP

http://poj.org/problem?id=3356 题意: 给两个长度不大于1000的串,修改其中一个串使得两串相同,问最少修改次数.修改有三种,插入一个字符,删除一个字符,改变一个字符. 分析: 直接给方程. dp[i][j]表示第一个串前i位和第二串前j位匹配的最小修改次数. dp[0][0] = 0, dp[length(x)][length(y)]为答案. dp[i][j] = min(dp[i-1][j-1] + x[i] != y[j], dp[i-1][j] + 1, d

poj4323 最短编辑距离

AGTC Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12240   Accepted: 4594 Description Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below: Deletion: a letter

hdu4271 Find Black Hand 2012长春网络赛E题 最短编辑距离

hdu4271 Find Black Hand  2012长春网络赛E题  最短编辑距离 Find Black Hand Time Limit : 5000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 19   Accepted Submission(s) : 1 Problem Description I like playing game with my friend

动态规划之编辑距离

思考:我们可以从题目中给出的6种操作描述,找到递归式,比如复制操作是i和j都增加1.那么递归式就是c[i][j]=c[i-1][j-1]+cost[COPY].c[i][j]表示从字符串i复制到字符串j所需要的总代价.其他操作类似. 递归式如下: 代码如下: #include <iostream> using namespace std; enum {COPY,REPLACE,DELETE,INSERT,TWIDDLE,KILL,ENUM_MAX};//TWIDDLE旋转 struct T {