首页 > 试题广场 >

编辑距离(一)

[编程题]编辑距离(一)
  • 热度指数:23808 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个字符串 str1 和 str2 ,请你算出将 str1 转为 str2 的最少操作数。
你可以对字符串进行3种操作:
1.插入一个字符
2.删除一个字符
3.修改一个字符。

字符串长度满足 ,保证字符串中只出现小写英文字母。
示例1

输入

"nowcoder","new"

输出

6

说明

"nowcoder"=>"newcoder"(将'o'替换为'e'),修改操作1次
"nowcoder"=>"new"(删除"coder"),删除操作5次      
示例2

输入

"intention","execution"

输出

5

说明

一种方案为:
因为2个长度都是9,后面的4个后缀的长度都为"tion",于是从"inten"到"execu"逐个修改即可  
示例3

输入

"now","nowcoder"

输出

5
#define min(a,b) (a<b?a:b)
#define min3(a,b,c) (a<min(b,c)?a:min(b,c))
int editDistance(char* str1, char* str2 ) {
    int dp[1001][1001], i, j;
    for(i=1; i<=strlen(str1); i++) 
        dp[i][0] = i;
    for(i=1; i<=strlen(str2); i++) 
        dp[0][i] = i;
    for(i=1; i<=strlen(str1); i++) {
        for(j=1; j<=strlen(str2); j++) {
            if(str1[i-1]==str2[j-1]) 
                dp[i][j] = dp[i-1][j-1];
            else 
                dp[i][j] = min3(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])+1;
        }
    }
    return dp[i-1][j-1];
}

编辑于 2024-03-26 23:18:26 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param str1 string字符串
 * @param str2 string字符串
 * @return int整型
 */
int editDistance(char* s, char* t ) {
    // 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;
    }
    for (int iii = 1; iii <= n; iii++) {
        mined[0][iii] = iii;
    }
    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] + 1) < (mined[j][k - 1] + 1)) {
                    if ((mined[j - 1][k - 1] + 1) < (mined[j - 1][k] + 1)) {
                        mined[j][k] = (mined[j - 1][k - 1] + 1);
                    } 
                    else {
                        mined[j][k] = (mined[j - 1][k] + 1);
                    }
                } 
                else {
                    if ((mined[j][k - 1] + 1) < (mined[j - 1][k] + 1)) {
                        mined[j][k] = (mined[j ][k - 1] + 1);
                    } 
                    else {
                        mined[j][k] = (mined[j - 1][k] + 1);
                    }

                }
                //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:34:15 回复(0)