动态规划练习
题目描述
给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
插入一个字符 删除一个字符
替换一个字符
#include <iostream> #include <vector> #include <string> using namespace std; int find_min(int x, int y, int z) { int min = x; if (y < min) { min = y; } if (z < min) { min = z; } return min; } int main() { int m, n; string s1,s2; s1 = "fish"; s2 = "fsoh"; m = s1.length(); n = s2.length(); vector<vector<int>> state(n+1, vector<int>(m+1)); //初始化 state[0][0] = 0; for (int i = 1; i <= m; i++) { state[0][i] = i; } for (int i = 1; i <= n; i++) { state[i][0] = i; } /*state[i][j]表示字符串s2的前i个字符组成的子串和字符串s1 *前j个字符组成的子串修改为相同要操作的最少次数 * 如果当前两字符相同:则不作任何操作;继承上次操作的最优解 * 如果当前字符串不同: * 如果是插入当前s2[i-1]字符,则state[i - 1][j]+1; * 如果是删除当前s2[i-1]字符, 则state[i][j - 1]+1; * 如果是替换当前s2[i-1]字符, 则state[i][j]+1; *为了保证子结构最忧,取三者的最小值 */ for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { //如果当前两字符相等state[i-1][j-1] if (s1[i - 1] == s2[j - 1]) { state[i][j] = find_min(state[i - 1][j - 1], state[i][j - 1], state[i - 1][j]); } else { state[i][j] = find_min(state[i - 1][j - 1], state[i][j - 1], state[i - 1][j]) + 1; } } } cout << state[n][m] << endl; system("pause"); return 0; }

浙公网安备 33010602011771号