操作名称:删除、插入、替换
编辑距离:编辑操作的数量
将单词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;elsecout << "用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];//initfor (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);}
