算法題目: 動態規劃 之 最短編輯距離

問題:java

對於長度相同的2個字符串A和B,其距離定義爲相應位置字符距離之和。2個非空格字符的距離是它們的ASCII碼之差的絕對值;空格與空格的距離爲0,空格與其餘字符的距離爲一個定值k。在通常狀況下,字符串A和B的長度不必定相同。字符串A的擴展是在A中插入若干空格字符所產生的字符串。在字符串A和B的全部長度相同的擴展中,有一對距離最短的擴展,該距離稱爲字符串A和B的擴展距離。對於給定的字符串A和B,設計一個算法,計算其擴展距離。算法

測試數據:測試

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

輸出:10.net

輸入:cdd      snmn        1       (分別表示字符串A、B和定值k)設計

輸出:7code

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

輸出:2blog


//當場沒作出來,汗顏啊字符串

//回來查了下,原來是動態規劃

//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
    }
}


呵呵,寫完以後發現網上有篇更詳細的解析:

字符串編輯距離

相關文章
相關標籤/搜索