问题:
对于长度相同的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
}
}
呵呵,写完之后发现网上有篇更详细的解析: