算法设计与分析: 3-20 字符串比较问题

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

猜你喜欢

转载自blog.csdn.net/ioio_/article/details/81042657