最小编辑代价

//最小编辑代价
public class MinPrice{
	
	//经典的动态规划解法(时间复杂度为O(M*N),额外的空间复杂度为O(M*N))
	public static int minCost01(String str1,String str2,int ic,int dc,int rc)
	{

		if(str1==null||str2==null)
		{
			return 0;
		}
		//将字符串转换成数组
		char[]ch1=str1.toCharArray();
		char[]ch2=str2.toCharArray();
        int row=ch1.length+1;
        int col=ch2.length+1;
        //构造动态规划表
        int[][]dp=new int[row][col];

        for(int i=1;i<row;i++)
        {
        	dp[i][0]=dc*i;
        }
        for(int j=1;j<col;j++)
        {
        	dp[0][j]=ic*j;
        }
        for(int i=1;i<row;i++)
        {
        	for(int j=1;j<col;j++)
        	{

        		//四种情况
        		if(ch1[i-1]==ch2[j-1])
        		{
        			dp[i][j]=dp[i-1][j-1];
        		}else{
        			dp[i][i]=dp[i-1][j-1]+rc;
        		}
        		dp[i][j]=Math.min(dp[i][j],dp[i][j-1]+ic);
        		dp[i][j]=Math.min(dp[i][j],dp[i-1][j]+dc);
        	}
        }
        return dp[row-1][col-1];

	}

	//压缩空间的动态规划(滚动法)(时间复杂度为O(M*N),额外的空间复杂度为O(min(M,N))
    public static int minCost02(String str1,String str2,int ic,int dc,int rc)
    {
    	if(str1==null||str2==null)
    	{
    		return 0;
    	}
    	char[]ch1=str1.toCharArray();
    	char[]ch2=str2.toCharArray();
    	char[]longs=ch1.length>=ch2.length?ch1:ch2;
    	char[]shorts=ch1.length<ch2.length?ch1:ch2;
    	//str2较长就交换ic和dc的值
    	if(ch1.length<ch2.length)
    	{
    		int temp=ic;
    		ic=dc;
    		dc=temp;
    	}
    	int[]dp=new int[shorts.length+1];
    	for(int i=1;i<=shorts.length;i++)
    	{ 
           dp[i]=ic*i;
    	}
    	for(int i=1;i<=longs.length;i++)
    	{    //pre表示左上角的值
    		int pre=dp[0];
    		dp[0]=dc*i;
    		for(int j=1;j<=shorts.length;j++)
    		{
    			int temp=dp[j];
    			if(longs[i-1]==shorts[j-1])
    			{
    				dp[j]=pre;
    			}else{
    				dp[j]=pre+rc;
    			}
    			dp[j]=Math.min(dp[j],dp[j-1]+ic);
    			dp[j]=Math.min(dp[j],temp+dc);
    			pre=temp;

    		}
    	}
    	return dp[shorts.length];
    }
	public static void main(String[]args)
	{
		String str1="abc";
		String str2="adc";
		//经典动态规划法
		System.out.println(minCost01(str1,str2,5,3,2));
		//压缩空间滚动法
		System.out.println(minCost02(str1,str2,5,3,2));


	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值