最优编辑
题目:对于两个字符串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]相同![](https://images2015.cnblogs.com/blog/1062362/201704/1062362-20170419214308071-959539407.png)
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]; }