最小编辑代价(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/难度较难)的主要内容,如果未能解决你的问题,请参考以下文章
将字符串转化为整数(NC100/考察次数Top73/难度较难)
将字符串转化为整数(NC100/考察次数Top73/难度较难)
将字符串转化为整数(NC100/考察次数Top73/难度较难)