DP编辑距离

俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。

编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。 

 

如果是: 
abcde 
acefg 
最优对齐状态是: 
abcde 
a  c  efg 
没有对上的列数是4,函数输出值为4。

状态转移方程是:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }

你看懂啦吗?

d[i][j]表示s1的前i个和s2的前j个字符相等。

初始状态为d[i][0]=i;d[0][i]=i;

(1)d[i-1][j]表示s1的前i-1个字符和s2的前j个字符已经相同啦,此时可以在s1的后面加上s2的最后一个字符或者把s2最后的字符去掉,即此时d[i][j]=d[i-1][j]+1;

(2)d[i][j-1]和(1)相同;

(3)d[i-1][j-1]时分两种情况

当s1[i]==s2[j]时,d[i][j]=d[i-1][j-1];

当s1[i]!=s2[j]时,d[i][j]=d[i-1][j-1]+1;

 Hrbust 1284

 

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 char  s1[1005],s2[1005];
 7 int dp[1005][1005];
 8 int main()
 9 {
10     int n;
11     cin>>n;
12     while(n--)
13     {
14         cin>>s1+1>>s2+1;
15         int l1=strlen(s1+1);
16         int l2=strlen(s2+1);
17         dp[0][0]=0;
18         for(int i=1;i<=l1;i++){
19             dp[i][0]=i;
20         }
21         for(int i=1;i<=l2;i++){
22             dp[0][i]=i;
23         }
24         for(int i=1; i<=l1; i++)
25         {
26             for(int j=1; j<=l2; j++)
27             {if(s1[i]==s2[j])//if一定要紧接着for,顺序错啦就不对啦哦
28                         dp[i][j]=dp[i-1][j-1];
29                     else dp[i][j]=dp[i-1][j-1]+1;
30                dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
31                 dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
32 
33 
34 
35 
36             }
37         }
38         cout<<dp[l1][l2]<<endl;
39     }
40     return 0;
41 }
View Code

 

转载于:https://www.cnblogs.com/shangjindexiaoqingnian/p/5749168.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值