码迷,mamicode.com
首页 > 其他好文 > 详细

算法题目: 动态规划 之 最短编辑距离

时间:2014-07-25 11:44:22      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:style   java   color   数据   2014   for   re   c   

问题:

对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。

测试数据:

输入:cmc      snmn        2       (分别表示字符串A、B和定值k)

输出:10

输入:cdd      snmn        1       (分别表示字符串A、B和定值k)

输出:7

输入:cd      ad        1       (分别表示字符串A、B和定值k)

输出:2


//当场没做出来,汗颜啊

//回来查了下,原来是动态规划

//JAVA实现了一下:

import static java.lang.Math.abs;
import static java.lang.Math.min;
public class DPString {
    public static int MAX_LEN = 2014;
    public static int work(char str1[], char str2[], int k) {
        int[][] dp = new int[MAX_LEN][MAX_LEN];
        int length1 = str1.length;
        int length2 = str2.length;
        dp[0][0] = 0;
        for (int i = 1; i <= length1; i++) {
            dp[i][0] = i * k;
        }
        for (int i = 1; i <= length2; i++) {
            dp[0][i] = i * k;
        }
        for (int i = 1; i <= length1; i++) {
            for (int j = 1; j <= length2; j++) {
                dp[i][j] = min(dp[i - 1][j - 1] + abs(str1[i - 1] - str2[j - 1]), min(dp[i - 1][j], dp[i][j - 1]) + k);
            }
        }
        return dp[length1][length2];
    }
    public static void main(String[] args) {
        String stra = "cdd";
        String strb = "snmn";
        int k = 1;
        System.out.println(work(stra.toCharArray(), strb.toCharArray(), k));// output 7
    }
}


算法题目: 动态规划 之 最短编辑距离,布布扣,bubuko.com

算法题目: 动态规划 之 最短编辑距离

标签:style   java   color   数据   2014   for   re   c   

原文地址:http://my.oschina.net/u/869174/blog/294696

(1)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!