UNIX系统下有一个行编辑器ed,它每次只对一行文本做删除一个字符、插入一个字符或替换一个字符三种操作。例如某一行的内容是“ABC”,经过把第二个字符替换成“D”、删除第一个字符、末尾插入一个字符“B”,这三步操作后,内容就变成了“DCB”。即“ABC”变成“DCB”需要经过3步操作,我们称它们的编辑距离为3。
现在给你两个任意字符串(不包含空格),请帮忙计算它们的最短编辑距离。
输入描述:
输入包含多组数据。
每组数据包含两个字符串m和n,它们仅包含字母,并且长度不超过1024。
输出描述:
对应每组输入,输出最短编辑距离。
输入例子:
ABC CBCD
ABC DCB
转移方程
dp[i][j]=i j==0
j i==0
dp[i-1][j-1] str1[i-1]=str2[j-1]
min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1; str1[i-1]!=str2[j-1]
str1[i-1]!=str2[j-1] 时, dp[i-1][j]对应删除操作
dp[i][j-1]对应插入操作
dp[i-1][j-1]对应替换操作
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 int minnum(int a,int b) 7 { 8 return a<b?a:b; 9 } 10 int main() 11 { 12 string str1,str2; 13 while(cin>>str1>>str2) 14 { 15 int m=str1.size(); 16 int n=str2.size(); 17 vector<vector<int>>dp(m+1,vector<int>(n+1,0)); 18 for(int i=1;i<=m;i++) 19 dp[i][0]=i; 20 for(int j=1;j<=n;j++) 21 dp[0][j]=j; 22 for(int i=1;i<=m;i++) 23 { 24 for(int j=1;j<=n;j++) 25 { 26 if(str1[i-1]==str2[j-1]) 27 dp[i][j]=dp[i-1][j-1]; 28 else 29 { 30 dp[i][j]=minnum(dp[i-1][j],dp[i][j-1]); 31 dp[i][j]=minnum(dp[i][j],dp[i-1][j-1])+1; 32 } 33 } 34 } 35 cout<<dp[m][n]<<endl; 36 } 37 } 38