动态规划练习

题目描述

给出两个单词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;
}

 

posted @ 2019-12-09 16:39  akatsukiaoi18  阅读(95)  评论(0)    收藏  举报