题目:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。
思路:生成dp[n+1][m+1]的二维表,列代表s1,开头第一个是空,行代表s2,开头第一个是空,dp[i][j]代表s1[0,,,i]生成s2[0,,,j]的最小代价,比如s1="ab12cd3",s2="abcdf",那么dp[0][0]=0,dp[1][0]就是把s1的第一位‘a’变成空,即删除'a',依次类推求得第一列,同理第一行就是每次增加字符到s1[1,,,i],故也可求得第一行。dp[i][j]分为四种情况,1.s1增加一个字符到s2 ic+dp[i-1][j] 2.s1删除一个字符到s2 dp[i][j-1]+dc 3.s1和s2之前相同,当前不相同,替换当前 dp[i-1][j-1]+rc 4 .s1和s2之前相同,当前也相同,那么dp[i][j]就和dp[i-1][j-1]相同
public int findMinCost(String A, int n, String B, int m, int c0, int c1, int c2) {
int[][] dp = new int[n+1][m+1];
dp[0][0] = 0;
for(int i=1;i<=n;i++){
dp[i][0]=i*c1;
}
for(int i=1;i<=m;i++){
dp[0][i]=i*c0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(A.charAt(i-1)!=B.charAt(j-1)){
dp[i][j]=Math.min(dp[i-1][j-1]+c2,Math.min(dp[i-1][j]+c1,dp[i][j-1]+c0));
}else
dp[i][j]=dp[i-1][j-1];
}
}
return dp[n][m];
}