首页 > 代码库 > 动态规划之寻找编辑距离
动态规划之寻找编辑距离
废话少说:上代码
1 /*此程序实现功能:输入两串字符s1,s2,求出其编辑距离。编辑距离:表示插入一个字符,删除一个字符,替换一个字符使得一个字符串和另一个字符串相等,三种操作分别表示1*/ 2 /*算法思想:动态规划*/ 3 #include<iostream> 4 #include<string> 5 using namespace std; 6 template <typename T> T min(T a, T b, T c) { 7 if (a < b&&a < c) 8 return a; 9 else10 if (b < c)11 return b;12 else13 return c;14 }15 int EditDistance(string s1, string s2);//求编辑距离16 int main() {17 string s1 , s2;18 cout << "请输入字符串s1:"; cin >> s1; cout << endl;19 cout << "请输入字符串s2:"; cin >> s2; cout << endl;20 cout << "s1与s2的编辑距离是:" << EditDistance(s1, s2) << endl;21 //delete s1, s2;22 }23 int EditDistance(string s1, string s2) {24 //m[|s1|][|s2|]是一个二维数组,矩阵第i行第j列的元素保存的是s1的前i个字符和s2的前j个字符的编辑距离25 // 分配行指针数组26 int x = 0;27 int **m = new int*[s1.length() + 1];28 // 分配列指针数组29 for (int i = 0; i < s1.length() + 1; i++) {30 m[i] = new int[s2.length() + 1];31 //初始化,将数组的第一列每行设为对应的值,即假设s2是一个空串32 m[i][0] = i;33 }34 //初始化,将数组的第一列每行设为对应的值,即假设s2是一个空串35 for (int j = 0; j < s2.length() + 1; j++)36 m[0][j] = j;37 //动态规划核心算法:min中的三个参数分别表示在s1中替换一个,插入一个和在s2中插入一个(即在s1中删除一个)的操作38 for (int i = 1; i < s1.length() + 1; i++) {39 40 for (int j = 1; j < s2.length() + 1; j++) {41 x = 0;42 if (s1[i - 1] != s2[j - 1])43 x = 1;44 m[i][j] = min<int>(m[i - 1][j - 1] + x, m[i - 1][j] + 1, m[i][j - 1] + 1);45 }46 }47 x = m[s1.length()][s2.length()];48 for (int i = 0; i < s1.length() + 1; i++)49 delete[] m[i];50 return x;51 }
动态规划之寻找编辑距离
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。