最小编辑代价(NC35/考察次数Top52/难度较难)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小编辑代价(NC35/考察次数Top52/难度较难)相关的知识,希望对你有一定的参考价值。

描述:
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。

示例1
输入:
“abc”,“adc”,5,3,2
返回值:
2
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 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(string str1, string str2, int ic, int dc, int rc) {
        // write code here
        //str1变换成str2的编辑代价,动态规划,
        //dp[i][j]表示str1的前i个字符编辑成str2的前j个字符需要的最小操作数;
        //初始化动作//dp[0][j]=j,j次插入
                  //dp[i][0]=i,i次删除
        //过渡公式,当i字符等于j字符时,dp[i][j]=dp[i-1][j-1],不需要操作
                 //当i字符不等于j字符时,dp[i][j]=min(insert, delete, replace)
                 //int insert=dp[i][j-1]+1;i个编辑成j-1个字符,再插入一个j;
                 //int delete=dp[i-1][j]+1;i-1个编辑成j个字母,再删除一个i;
                 //int replace=dp[i-1][j-1]+1;i-1个编辑成j-1个字母,再将i替换成j;
        int m=str1.size();
        int n=str2.size();
        
        vector<vector<int>> dp(m+1, vector<int>(n+1));
//         int [][]dp=new int[m+1][n+1];
//         int dp[m+1][n+1];
        dp[0][0]=0;
        for(int i=1; i<=m; i++)
        {
            dp[i][0] = i*dc;                         //进行删除操作来完成
        }
        for(int j=1; j<=n; j++)
        {
            dp[0][j] = j*ic;                         //进行插入操作来完成
        }
        for(int i=1; i<=m; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(str1[i-1] == str2[j-1])
                {
                    dp[i][j]=dp[i-1][j-1];           //相等则代价相等,不需要替换
                }
                else
                {
                    int ins=dp[i][j-1]+ic;           //在后面j-1的基础上插入一个
                    int del=dp[i-1][j]+dc;           //在前面i-1的基础上删除一个
                    int rep=dp[i-1][j-1]+rc;         //在前面i-1和后面j-1的基础上替换
                    dp[i][j]=min(ins,min(del,rep));
                }
            }
        }
        return dp[m][n];
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于最小编辑代价(NC35/考察次数Top52/难度较难)的主要内容,如果未能解决你的问题,请参考以下文章

括号序列(NC52/考察次数Top18/难度简单)

将字符串转化为整数(NC100/考察次数Top73/难度较难)

将字符串转化为整数(NC100/考察次数Top73/难度较难)

将字符串转化为整数(NC100/考察次数Top73/难度较难)

将字符串转化为整数(NC100/考察次数Top73/难度较难)

字符串的排列(NC121/考察次数Top38/难度较难)