首页 > 代码库 > 编辑距离(动规)

编辑距离(动规)

题意:设A,B是两个字符串。我们现在要用最少的操作的次数,将字符串A转换成字符串B,这里所说的字符操作有三种:

(1)删除一个字符

(2)插入一个字符

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

任务:

对任意A,B计算出字符串A转换成字符串B的最少操作次数

输入:第一行为字符串A

         第二行为字符串B

 长度都小于200

输出:

最小操作次数

【思路】:与最长公共子序列相似,还是要看最后一个是否相同

【代码】

技术分享
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 using namespace std;
 5 int f[202][202];//f[m][n]为长度为m和n的两个字符串的最少操作次数 
 6 int main()
 7 {
 8     string s1,s2;
 9     cin>>s1>>s2;
10     int m=s1.length();
11     int n=s2.length();
12     for(int i=1;i<=m;i++)
13     f[i][0]=i;//当第二个串长度为0时就要删除i个数 
14     for(int i=1;i<=n;i++)
15     f[0][i]=i;//当第一个串长度为0时需要填上i个数 
16     for(int i=1;i<=m;i++)
17     {
18         for(int j=1;j<=n;j++)
19         {
20             if(s1[i-1]==s2[j-1])//让最后两个数相同时 
21             f[i][j]=f[i-1][j-1];//f[i][j]的操作次数就是f[i-1][j-1]的操作次数 
22             else    
23            f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1; 
24          //否则就从删掉最后一个数f[i-1][j],改一个数f[i-1][j-1],插入一个数f[i][j-1]中取一个
25          //最小的,最后还要加1,因为还要有这一步的操作次数 
26         }
27     }
28     printf("%d",f[m][n]);
29     return 0;
30 }
View Code

 

编辑距离(动规)