3-20 字符串比较问题
问题描述
对于长度相同的 2 个字符串 A 和 B,其距离定义为相应位置字符距离之和。2 个非空格字符的距离是它们的 ASCII 码之差的绝对值。空格与空格的距离为 0;空格与其它字符的距 离为一定值 k。
在一般情况下,字符串 A 和 B 的长度不一定相同。字符串 A 的扩展是在 A 中插入若干 空格字符所产生的字符串。在字符串 A 和 B 的所有长度相同的扩展中,有一对距离最小的 扩展,该距离称为字符串 A 和 B 的扩展距离。
对于给定的字符串 A 和 B,试设计一个算法,计算其扩展距离。
数据输入:
第 1 行是字符串 A;第 2 行是字符串 B。第 3 行是空格与其它字符的距离定值 k。
Java
import java.util.Scanner;
/*
val(i,j): 字符串A和B的子串A[1..i]和B[1..j]的扩展距离
val(i,j)=min{val(i-1,j)+k, val(i,j-1)+k, val(i-1,j-1)+dist(ai, bj)}
*/
public class ZiFuChuanBiJiao {
private static String str1,str2;
private static int len1,len2;
private static int[][] val;
private static int k;//空格与其他字符的距离定值
private static int MAX = 100000;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
while (true){
str1 = input.next();
str2 = input.next();
k = input.nextInt();
len1 = str1.length();
len2 = str2.length();
val = new int[len1+1][len2+1];
val[0][0] = 0;
comp();
}
}
private static void comp(){
int i,j,tmp;
for(i=0; i<=len1; i++)
for(j=0; j<=len2; j++)
if(i+j > 0){
val[i][j] = MAX;
if(i*j>0 && (tmp=(val[i-1][j-1])+dist(str1.charAt(i-1),str2.charAt(j-1))) < val[i][j])
val[i][j] = tmp;
if(i>0 && (tmp=(val[i-1][j])+dist(str1.charAt(i-1),' ')) < val[i][j])
val[i][j] = tmp;
if(j>0 && (tmp=(val[i][j-1])+dist(str2.charAt(j-1),' ')) < val[i][j])
val[i][j] = tmp;
}
System.out.println(val[len1][len2]);
}
private static int dist(char a, char b){
if(a ==' ' || b == ' ')
return k;
else
return Math.abs(a-b);
}
}
Input & Output
cmc
snmn
2
10
Reference
王晓东《计算机算法设计与分析》(第3版)P96