对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。
给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
测试样例:
"abc",3,"adc",3,5,3,100
返回:8
class MinCost {
public:
int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {
//dp[i][j]表示将A[0...i-1]转化为B[0...j-1]所需要最少代价,m+1,n+1说明前面需要空串初始值
int dp[n+1][m+1];
for(int i=0;i<=n;i++)//删除i个元素
{ //从A(0...i)变换到空字符串"",需要将A中字符全删除,即代价为:c1 * i
dp[i][0]=i*c1;
}
for(int i=0;i<=m;i++)//插入i个元素
{ //从空字符串""变换到B(0...j),x需要添加B字符串中的所有字符,所以代价为:c0 * i
dp[0][i]=i*c0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int minLen=min(dp[i-1][j]+c1,dp[i][j-1]+c0);
//当要判断的字符相等则下面表达式中第一个参数为:dp[i][j] = dp[i-1][j-1],否则就要加上c2
//因为字符是从0开始计数的,所以要减掉1
if(A[i-1]==B[j-1])
minLen=min(minLen,dp[i-1][j-1]);
else
minLen=min(minLen,dp[i-1][j-1]+c2);
dp[i][j]=minLen;
}
}
return dp[n][m];
}
};