编辑距离 动态规划

动态规划经常被用来作为这个问题的解决手段之一。

整数 Levenshtein距离(字符串 str1[1..m], 字符串 str2[1..n])

//声明变量, d[i , j]用于记录str1[1...i]与str2[1..j]的Levenshtein距离

int d[0..m, 0..n]

//初始化

for i from 0 to m

d[i, 0] := i

for j from 0 to n

d[0, j] := j

//用动态规划方法计算Levenshtein距离

for i from 1 to m

for j from 1 to n

{

//计算替换操作的代价,如果两个字符相同,则替换操作代价为0,否则为1

if str1[i]== str2[j] then cost := 0

else cost := 1

//d[i,j]的Levenshtein距离,可以有

d[i, j] := minimum(

d[i-1, j] + 1, //在str1上i位置删除字符(或者在str2上j-1位置插入字符)

d[i, j-1] + 1, //在str1上i-1位置插入字符(或者在str2上j位置删除字符)

d[i-1, j-1] + cost // 替换操作

)

}

//返回d[m, n]

return d[m, n]

编辑距离 动态规划,布布扣,bubuko.com

时间: 2024-10-10 13:25:46

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

两个字符串的编辑距离-动态规划方法

两个字符串的编辑距离-动态规划方法[转载] 概念 字符串的编辑距离,又称为Levenshtein距离,由俄罗斯的数学家Vladimir Levenshtein在1965年提出.是指利用字符操作,把字符串A转换成字符串B所需要的最少操作数.其中,字符操作包括: 删除一个字符     a) Delete a character 插入一个字符     b) Insert a character 修改一个字符     c) Replace a character 例如对于字符串"if"和&qu

由LCS到编辑距离—动态规划入门—算法学习笔记

一切计算机问题,解决方法可以归结为两类:分治和封装.分治是减层,封装是加层. 动态规划问题同样可以用这种思路,分治. 它可以划分为多个子问题解决,那这样是不是用简单的递归就完成了?也许是的,但是这样会涉及太多的不便的操作.因为子问题有重叠! 针对这种子问题有重叠的情况的解决,就是提高效率的关键. 所以动态规划问题可以总结为:最优子结构和重叠子问题. 解决这个子问题的方式的关键就是:memoization,备忘录. 动态规划算法分以下4个步骤: 描述最优解的结构 递归定义最优解的值 按自底向上的方

编辑距离---动态规划(最小距离)

这里运用了最小距离的算法 经典的动态规划相同字符 左上角值加1 不相同字符 邻居三个取最小注意点也要把"" 空字符串考虑进去三个求最小可以改下为 Math.min(n, Math.min(m,l)) class Solution { public int min(int n , int m ,int l) { int temp = 0; if(m<=n&&m<=l) temp = m; else if(n<=m&&n<=l) te

TZOJ 1072: 编辑距离(动态规划)

1072: 编辑距离 时间限制(普通/Java):1000MS/10000MS     内存限制:65536KByte 总提交: 917            测试通过:275 描述 假设字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符修改成另一个字符这三种操作. 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 下面我们定义两个字符串的编辑距离:对于两个字符串a和b,通过上述的基本操作,我们可以把a变成b或b变成a,那么字符串a变成字符串b需要的最少基本字符操

hdu 4323 Magic Number (dp,编辑距离)

链接:hdu 4323 题意:给定n个串和m次询问,对于每次询问,给定一个字符串t,和最大操作次数a, 问在n个字符串中有多少个能在规定的次数之内变成字符串t. 说明:字符串的基本操作仅为:删除.插入和修改一个字符这三种操作 我们把进行了一次上述三种操作的任意一种操作称为进行了一步字符基本操作. 两个字符串的编辑距离:两个字符串a和b,通过上述的基本操作,把a变成b或b变成a, 需要的最少基本字符操作步数称为字符串a和字符串b的编辑距离 分析:分别求出n个字符串与字符串t之间的编辑距离,并判断是

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

编辑距离指通过修改,删除,添加.使得两个字符串能够相同所需要操作的次数. 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或者增加,删除,替换一次,同两个字符串的推前一个的编辑距离比较.最小值即编辑距

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

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

动态规划求解编辑距离

一.动态规划算法 动态规划算法通常基于一个递推公式及一个或多个初始状态.当前问题的解将由上一次子问题的解推出.使用动态规划来解题只需要多项式复杂度,因此它比 回溯法.暴力法要快.首先,我们要找到某个状态的最优解,然后在它的帮助下,找到下一个状态的最优解.要做的是抽象出动态规划的状态和状态转移方程(递推公式). 二.编辑距离 1.问题描述 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改为另一

动态规划之寻找编辑距离

废话少说:上代码 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