问题描述:编辑距离(Edit Distance)是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数,编辑操作包括增、删、改操作。
例如将kitten一字转成sitting:sitten (k→s)sittin (e→i)sitting (→g),最短编辑距离为3.
样例:
kitten
sitting
3
思路:和查找最长公共子序列有点类似,利用dp[i][j]表示字符串1的i位置和字符串2的j位置需要转换最少多少次,我们分成两种情况,一种这两个字符相等,那么此时不需要转换,如果不相等,那么就比较是增加一个,还是删除一个,或者是修改一个,同时,寻找其中的最小的那个即可
//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;
const int max_n=1e3;
int dp[max_n][max_n];
int main(){
string str1,str2;
cin >> str1>>str2;
int len1=str1.length();
int len2=str2.length();
//首先初始化数组的第一行和第一列
for(int i=0;i<=len1;i++){
dp[i][0]=i; //表示如果第二个字符串想要变成第一个字符串,就需要添加字符,而不是修改或者删除
}
for(int i=0;i<=len2;i++){
dp[0][i]=i; //同上
}
//状态转移
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(str1[i-1]==str2[j-1]){
dp[i][j]=dp[i-1][j-1]; //两个字符相等,也就是这个位置不需要添加,删除或者修改
}else{
int tmp=min(dp[i][j-1],dp[i-1][j]); //两个字符不相等,增加一个或者删除一个,假设第二个字符串不动
dp[i][j]=min(tmp,dp[i-1][j-1])+1; //或者修改一个
}
}
}
cout<<dp[len1][len2]<<endl;
return 0;
}