首页 > 试题广场 >

编辑距离(二)

[编程题]编辑距离(二)
  • 热度指数:36870 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。

数据范围:
要求:空间复杂度 ,时间复杂度
示例1

输入

"abc","adc",5,3,2

输出

2
示例2

输入

"abc","adc",5,3,100

输出

8

备注:

/**
 * min edit cost
 * @param str1 string字符串 the string
 * @param str2 string字符串 the string
 * @param ic int整型 insert cost
 * @param dc int整型 delete cost
 * @param rc int整型 replace cost
 * @return int整型
 */
int minEditCost(char* s, char* t, int ic, int dc, int rc ) {
    // write code here
    int m = strlen(s);
    int n = strlen(t);
    // if (m >= n + 2)
    //     return false;
    int** mined = (int**)malloc(sizeof(int*) * (m + 1));
    for (int i = 0; i <= m; i++) {
        mined[i] = (int*)calloc(n + 1, sizeof(int));
    }
    for (int ii = 1; ii <= m; ii++) {
        mined[ii][0] = ii*dc;
    }
    for (int iii = 1; iii <= n; iii++) {
        mined[0][iii] = iii*ic;
    }
    for (int j = 1; j <= m; j++) {
        for (int k = 1; k <= n; k++) {
            if (s[j - 1] == t[k - 1]) {
                mined[j][k] = mined[j - 1][k - 1];
            } else {
                if ((mined[j - 1][k - 1] + rc) < (mined[j][k - 1] + ic)) {
                    if ((mined[j - 1][k - 1] + rc) < (mined[j - 1][k] + dc)) {
                        mined[j][k] = (mined[j - 1][k - 1] + rc);
                    } else {
                        mined[j][k] = (mined[j - 1][k] + dc);
                    }
                } else {
                    if ((mined[j][k - 1] + ic) < (mined[j - 1][k] + dc)) {
                        mined[j][k] = (mined[j ][k - 1] + ic);
                    } else {
                        mined[j][k] = (mined[j - 1][k] + dc);
                    }

                }
                //mined[j][k]=((mined[j-1][k-1]+1)>(mined[j][k-1]+1):)
            }
        }
    }
    // if (mined[m][n] == 1)
    //     return true;
    return mined[m][n];
}

发表于 2023-01-05 21:42:23 回复(0)