思路
行代表一个字符串,列代一个字符串,设边界为s[0][i]=i;s[j][0]=j,代表从空字符串变成另一个字符串所需要的次数;
递推方程:
1、假设a[i]==b[j],即最后一位不用变化,那么s[i][j]=s[i-1][j-1];
2、假设a[i]!=b[j],那么有三种操作情况:
(1)将a[i]删除,s[i][j]=s[i-1][j]+1;
(2)将a[i]加入b[j],s[i][j]=s[i][j-1]+1;
(3)将a[i]换成b[j],s[i][j]=s[i-1][j-1]+1。
此题思路与最长公共子字符串类似,可参考那道题。
#include<iostream>
#include<cstring>
using namespace std;
int a[2001][2001]; //必须放外面,因为数组太大
int main(){
char b[2001],c[2001];
int i,j;
cin>>b>>c;
int len1=strlen(b);
int len2=strlen(c);
for(i=0;i<=len2;i++){
a[0][i]=i;
}
for(i=0;i<=len1;i++){
a[i][0]=i;
}
for(i=1;i<=len1;i++){ //行是字符串a
for(j=1;j<=len2;j++){ //列是字符串b
if(b[i-1]==c[j-1]){
a[i][j]= a[i-1][j-1];
}
else{
a[i][j]=min(a[i-1][j-1],min(a[i-1][j],a[i][j-1]))+1;
}
}
}
cout<<a[len1][len2]<<endl;
return 0;
}