题意:设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 }