操作名称:删除、插入、替换
编辑距离:编辑操作的数量
将单词kittchen通过编辑操作变成sitting
方案一:kittchen-sittchen-sitthen-sitten-sittn-sittin-sitting<编辑六次:编辑距离为6>
方案二:kittchen-sittchen-sitthen-sitten-sittin-sitting<编辑距离5>
问题描述:Minimum Edit Distance,MED
输入:
长度为n的字符串,长度为m的字符串t
输出:
求出一组编辑操作O=
#include<iostream>
using namespace std;
/*
操作名称:删除、插入、替换
编辑距离:编辑操作的数量
将单词kittchen通过编辑操作变成sitting
方案一:kittchen-sittchen-sitthen-sitten-sittn-sittin-sitting<编辑六次:编辑距离为6>
方案二:kittchen-sittchen-sitthen-sitten-sittin-sitting<编辑距离5>
问题描述:Minimum Edit Distance,MED
输入:
长度为n的字符串,长度为m的字符串t
输出:
求出一组编辑操作O=<e1,e2,e3.....en>零|O|最小,s经过O操作使得s=t
*/
void Print_MED(char Rec[][7],char s[],char t[], int i, int j) {
if (i == 0 && j == 0)
return;
if (Rec[i][j] == 'LU') {
Print_MED(Rec, s, t, i - 1, j - 1);
if (s[i] == t[j])
cout << "无需操作!" << endl;
else
cout << "用t[" << j << "]替换s[" << i << "]\n";
}
else if (Rec[i][j] == 'U') {
Print_MED(Rec, s, t, i - 1, j);
cout << "删除s[" << i << "]\n";
}
else {
Print_MED(Rec, s, t, i , j- 1);
cout << "插入t[" << j << "]\n";
}
}
int main() {
char s[] = "OABCBDAB", t[] = "OBDCABA";
const int n = 7, m = 6;
int Dp[n+1][m+1] = {};
char Rec[n+1][m+1];
//init
for (int i = 0; i <= n; i++) {
Dp[i][0] = i;
Rec[i][0] = 'U';
}
for (int i = 0; i <= m; i++) {
Dp[0][i] = i;
Rec[0][i] = 'L';
}
int c;
//动态规划
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++) {
c = 0;
if (s[i] != t[j])
c = 1; //辅助替换
int Replace = Dp[i - 1][j - 1] + c; //替换
int Delete = Dp[i - 1][j] + 1; //删除
int Insert = Dp[i][j - 1] + 1; //插入
int min = Replace;
min = min < Delete ? min : Delete;
min = min < Insert ? min : Insert;
if (min== Replace) {
Dp[i][j] = Replace; //根据递推公式构造Dp数组
Rec[i][j] = 'LU';
}
else if (min == Delete) {
Dp[i][j] = Delete;
Rec[i][j] = 'U';
}
else {
Dp[i][j] = Insert;
Rec[i][j] = 'L';
}
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++)
cout << Dp[i][j] << " ";
cout << endl;
}
cout << endl << "最短编辑距离为:" << Dp[n][m] << endl;
//追踪最优方案:(还有问题)
//Print_MED(Rec, s, t, n, m);
}