动态规划求解编辑距离

一、动态规划算法

动态规划算法通常基于一个递推公式及一个或多个初始状态。当前问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式复杂度,因此它比

回溯法、暴力法要快。首先,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解。要做的是抽象出动态规划的状态和状态转移方程(递推公式)。

二、编辑距离

1、问题描述

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:

(1)删除一个字符;

(2)插入一个字符;

(3)将一个字符改为另一个字符。

将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试设计一个有效算法,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。

要求:

输入:第1行是字符串A,第2行是字符串B。

输出:字符串A和B的编辑距离d(A,B)

2、求解过程

用d[i,j]表示A[1.....i]到B[1.....j]的编辑距离,则

d[i,0]=i:表示长度为i的串A到一个空串的编辑距离,即为串A的长度;

d[0,j]=j:表示空串到一个长度为j的串B的编辑距离,即为串B的长度;

d[i,j]=d[i-1,j-1]: if A[i]==B[j];

d[i,j]=min(d[i-1,j-1](将A[i]替换成B[j]),d[i-1,j](将A[i]删除),d[i,j-1](在A[i]后插入B[j]))+1:if A[i] != B[j]。

java代码:

public class EditDistance {

int min(int a,int b,int c) {

int t = a < b ? a : b;

return t < c ? t : c;

}

void editDistance(char[] s1,char[] s2) {

int len1=s1.length;

int len2=s2.length;

int d[][]=new int[len1+1][len2+1];

int i,j;

for(i = 0;i <= len1;i++)

d[i][0] = i;

for(j = 0;j <= len2;j++)

d[0][j] = j;

for(i = 1;i <= len1;i++)

for(j = 1;j <= len2;j++)

{

int cost = s1[i-1] == s2[j-1] ? 0 : 1;

int deletion = d[i-1][j] + 1;

int insertion = d[i][j-1] + 1;

int substitution = d[i-1][j-1] + cost;

d[i][j] = min(deletion,insertion,substitution);

}

System.out.println(d[len1][len2]);

}

public static void main(String[] args)

{

EditDistance ed = new EditDistance();

String a="abd";

String b="bcd";

ed.editDistance(a.toCharArray(),b.toCharArray());

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-29 23:12:26

动态规划求解编辑距离的相关文章

动态规划求解最长公共子序列

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解.与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的.若用分治法来解决这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间.然而,不同子问题的数目常常只有多项式量级.在用分治法求解时,有些子问题被重复计算了许多次.如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式

动态规划求解最大字段和及其变种问题

动态规划(Dynamic Programming, DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题. 一. 最大字段和问题 问题定义 设数组为a[k],1≤k≤n,最大字段和X定义为: X=max1≤i≤j≤n{∑k=ija[k]} X直观含义即,求任一连续字数组的最大和. 问题分析 不妨设: b[j]=max1≤m≤j{∑k=mja[k]} 其中,1≤j≤n b[j]的直观含义为,以a[j]为结束元素的连续数组的最大和. 由X和b[j]的定义,易知: X=max1

动态规划求解0-1背包问题

0-1背包问题是: 一个背包能承受的最大容量为max_weight,  现在有n个物品, 它们的重量分别是{w1,w2,w3,......wn}, 和价值分别是{v1,v2,......vn}, 现在要求在满足背包装载的物品不超过最大容量的前提下,保证装载的物品的价值最大? 动态规划求解过程可以这样理解: 对于前i件物品,背包剩余容量为j时,所取得的最大价值(此时称为状态3)只依赖于两个状态. 状态1:前i-1件物品,背包剩余容量为j.在该状态下,只要不选第i个物品,就可以转换到状态3. 状态2

1008-----算法笔记----------0-1背包问题(动态规划求解)

1.问题描述 给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.问题分析 上述问题可以抽象为一个整数规划问题,即求满足 (a)Σwixi ≤ C:(b)xi ∈(0,1),  1≤i≤n:条件下,∑vixi最大时的一个物品xi序列.分析问题可以发现,该问题具有最优子结构性质,那么就可以尝试用动态规划方法求解,而动态规划求解的关键就是列出问题的递归关系表达式. 设m(i,j)为背包容量为j,可选物品为i,

动态规划求解所有字符的组合数

一,问题描述 给定若干个字符,求解 这些字符能够表示的最多组合个数.比如{'a','b','c'} 一共有七种组合.(每种组合没有重复的字符 且 组合的种数与顺序无关,如 ab 和 ba 是同一种组合) a.b .c .ab .ac .bc .abc 其实,求组合个数,可以用公式来求解:具给定 n种字符,一共有  c(n,1)+c(n,2)+...+c(n,n)种不同的组合.其中,c(n,i)表示:从n个字符中任选 i 个的组合数,数学表示为:C in. 二,DP算法思路 既然已经可以用上面的公

动态规划之编辑距离

思考:我们可以从题目中给出的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 {

【算法导论之七】动态规划求解最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问

动态规划求解数组连续最大和

1.动态规划的思想 动态规划即把全局问题的解分解为一个个子问题的解,一个个子问题的解存在递推关系,即上一个问题的解是下一个问题解的基础,这样直到求解出全局问题的解. 2.求一个数组中连续几个数相加的最大值: 给定一个数组,它里面全是一些数字,要找出任何连续的值中最大的和. 例: 已有数组:{31,-41,59,26,-53,58,97,-93,-23,84} 它的连续的值最大的和则是第 2 个值到第 6 个值的合:187. 3.求解过程 sum(i)表示前i个数的和,max(i)表示长度为i的数

动态规划:编辑距离和通配符匹配

编辑距离指通过修改,删除,添加.使得两个字符串能够相同所需要操作的次数. edit(i,j) if S1[i]==S2[j] temp=0; else temp=1; edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1); edit(i,j)=min(A[i-1][j-1]+temp,A[i-1][j]+1,A[i][j-1]+1);公式可以理解成, 如果由S1或者增加,删除,替换一次,同两个字符串的推前一个的编辑距离比较.最小值即编辑距