编辑距离问题

3.编辑距离问题(edit.pas/c/cpp)

【问题描述】

设A和B是两个字符串。要用最少的字符操作将字符串A变成字符串B。这里所说的字符操作包括:

(1)删除一个字符。

(2)插入一个字符。

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

将字符串A变成字符串B的最少字符操作数称为字符串A到B的编辑距离,记为d (A,B)。试编写程序,对任意给定的2个字符串A和B,计算出他们的编辑距离d (A,B)。

【输入文件】

输入文件只有两行,分别是字符串A和字符串B。

【输出文件】

输出文件只有一行,即编辑距离d (A,B)。

【文件样例】

edit.in        edit.out

fxpimu        5

xwrs

【数据规模】

40%的数据字符串A,B长度均不超过100;

100%的数据字符串A,B长度均不超过4000;

动态规划经典问题

单词查错等都是这种算法;

还是举例子,对于这两个串,从a-》b和从b-》a的距离是一样的,毕竟距离是标量啊。

我们设串a: abcdefg

b:
 abcdehgk

f[i][j]是a串到i,b串到j的距离,

如果a[i]==b[j]

f[i][j]= f[i-1][j-1],这显然。

否则

先添加 在a的后面加k 这时 f[i][j]= f[i][j-1]

或者 删a的最后一个
f[i][j]= f[i-1][j]

或者换 把a的最后一个即g 换成k f[i][j]= f[i-1][j-1]

故f[i][j]=Min(f[i][j-1],f[i-1][j],f[i-1][j-1])+1

初始化 f[0][j]=j,f[i][0]=I;

#include<iostream>
#include<cstring>
using namespace std;
int f[4010][4010];
char a[4010];
char b[4010];
int flag;
int main()
{
    cin>>a>>b;
    for(int i=1;i<=strlen(a);i++) f[i][0]=i;
    for(int i=1;i<=strlen(b);i++) f[0][i]=i;
    for(int i=1;i<=strlen(a);i++)
      for(int j=1;j<=strlen(b);j++)
        {
            flag=(a[i-1]==b[j-1])?0:1;
            f[i][j]=min(min(f[i-1][j]+1,f[i][j-1]+1),f[i-1][j-1]+flag);
        }
    cout<<f[strlen(a)][strlen(b)];
    return 0;
}
时间: 2024-10-24 22:50:16

编辑距离问题的相关文章

最短编辑距离算法

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

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

编辑距离算法(Levenshtein)

编辑距离定义: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将eeba转变成abac: eba(删除第一个e) aba(将剩下的e替换成a) abac(在末尾插入c) 所以eeba和abac的编辑距离就是3 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 算法: 算法就是简单的线性动态规划(最长上升子序列就属于线性动态规划).

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

给出两个长度小于1000的字符串,有三种操作,插入一个字符,删除一个字符,替换一个字符. 问A变成B所需的最少操作数(即编辑距离) 考虑DP,可以用反证法证明依次从头到尾对A,B进行匹配是不会影响答案的 令dp[i][j]表示A[i]~[lenA]变成B[j]~[lenB]的最优解. 如果把B[j]插入到A[i]前,dp[i][j]=dp[i][j+1]+1 如果删除A[i],dp[i][j]=dp[i+1][j]+1. 如果A[i]==B[j], dp[i][j]=dp[i+1][j+1].

[LeetCode] One Edit Distance 一个编辑距离

Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance的拓展,然而这道题并没有那道题难,这道题只让我们判断两个字符串的编辑距离是否为1,那么我们只需分下列三种情况来考虑就行了: 1. 两个字符串的长度之差大于1,那么直接返回False 2. 两个字符串的长度之差等于1,那么长的那个字符串去掉一个字符,剩下的应该和短的字符串相同 3. 两个字符串的长度之

计算编辑距离

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串s2,操作有三种,添加一个字符,删除一个字符,修改一个字符 解析: 首先定义这样一个函数——edit(i, j),它表示第一

(每日算法)Leetcode--Edit Distance(编辑距离)

简单地说,就是仅通过插入(insert).删除(delete)和替换(substitute)个操作将一个字符串s1变换到另一个字符串s2的最少步骤数.熟悉算法的同学很容易知道这是个动态规划问题. 其实一个替换操作可以相当于一个delete+一个insert,所以我们将权值定义如下: I  (insert):1 D (delete):1 S (substitute):1 示例: intention->execution Minimal edit distance: delete i ; n->e

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

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

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排