编程题:最小编辑距离
题目描述
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,请输出将str1编辑成str2的最小代价。
输入:“abc”,“adc”,5,3,2 输出:2
输入:“abc”,“adc”,5,3,100 输出:8
分析
使用动态规划进行解题,dp[i][j]表示str1的i 位置转换成 str2的j 位置需要最小代价
通过代码
public int minEditCost (String str1, String str2, int ic, int dc, int rc) {
int len1 = str1.length();
int len2 = str2.length();
int[][] data = new int[len1+1][len2+1];
//第一列肯定是删除,因为str2没有一个字母
for(int i=1;i<=len1;i++){
data[i][0] = i*dc;
}
//第一行肯定是新增,因为str2的字母数在逐渐增加
for(int i=1;i<=len2;i++){
data[0][i] = i*ic;
}
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if (str1.charAt(i-1)==str2.charAt(j-1)){
data[i][j] = data[i-1][j-1];
}else{
int delete = data[i-1][j]+dc;
int add = data[i][j-1]+ic;
int update = data[i-1][j-1]+rc;
data[i][j] = Math.min(Math.min(add,delete),update);
}
}
}
return data[len1][len2];
}