最优编辑

题目:对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。给定两个字符串AB,及它们的长度和三种操作代价,请返回将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];
    }

 

posted @ 2017-04-19 21:32  雪浪snowWave  阅读(304)  评论(0编辑  收藏  举报