动态规划——编辑距离


参考博客:

http://blog.csdn.net/d87420572/article/details/17961485

http://blog.csdn.net/eraser567/article/details/50715746

http://blog.csdn.net/vonzhoufz/article/details/44627829

参考答案:

http://www.jiuzhang.com/solution/edit-distance

public class EditDistance {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
	}
	
	public int minDistance(String word1, String word2) {
        if(word1==null&&word2==null)
        	return 0;
		
		char[] ch1=word1.toCharArray();
        char[] ch2=word2.toCharArray();
        
        int m=ch1.length+1;
        int n=ch2.length+1;
        int[][] dis=new int[m][n];
        for(int j=0;j<n;j++){
        	dis[0][j]=j;
        }
        for(int i=0;i<m;i++){
        	dis[i][0]=i;
        }
        for(int i=1;i<m;i++){
        	for(int j=1;j<n;j++){
        		if(ch1[i-1]==ch2[j-1]){
        			dis[i][j]=dis[i-1][j-1];
        		}
        		else{
        			dis[i][j]=1+Math.min(dis[i-1][j], Math.min(dis[i][j-1],dis[i-1][j-1]));
        		}
        	}
        }
        
        return dis[m-1][n-1];   //特别要注意:前面数组的长度定义的是m和n,这里数组的某一个值的位置是m-1和n-1
    }

}


变式:





/**
	 * @param args
	 * ic:插入代价
	 * dc:删除代价
	 * rc:替换代价
	 */
	public static int editCost(String s1, String s2, int ic, int dc, int rc){
		int M=s1.length();
		int N=s2.length();
		char[] ch1=s1.toCharArray();
		char[] ch2=s2.toCharArray();
		
		int[][] dp = new int[M+1][N+1];
		dp[0][0]=0;
		for(int i=1;i<=M;i++){
			dp[i][0]=dp[i-1][0]+dc;  
		}
		
		for(int j=1;j<=N;j++){
			dp[0][j]=dp[0][j-1]+ic;
		}
		
		for(int i=1;i<=M;i++){
			for(int j=1;j<=N;j++){
				dp[i][j]=Math.min(dp[i-1][j]+dc, dp[i][j-1]+ic);
				if(ch1[i]==ch1[j]){
					dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]);
				}
				else{
					dp[i][j]=Math.min(dp[i][j],dp[i-1][j-1]+rc);
				}
			}
		}
		return dp[M][N];
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值