• 第3章 结构之法——计算字符串的相似度


    计算字符串的相似度

    问题描述

    分析与解法

    具体代码如下:

     1 package chapter3jiegouzhifa.StringSimilarity;
     2 /**
     3  * 计算字符串的相似度
     4  * 【解法一】
     5  * @author DELL
     6  *
     7  */
     8 public class StringSimilarity {
     9     public static int CalculateStringDistance(String str1, int b1, int e1, String str2, int b2, int e2){
    10         if(b1>e1){
    11             if(b2>e2)
    12                 return 0;
    13             else
    14                 return e2-b2+1;
    15         }
    16         if(b2>e2){
    17             if(b1>e1)
    18                 return 0;
    19             else
    20                 return e1-b1+1;
    21         }
    22         if(str1.charAt(b1)==str2.charAt(b2)){
    23             return CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
    24         }else{
    25             int t1 = CalculateStringDistance(str1,b1+1,e1,str2,b2,e2);
    26             int t2 = CalculateStringDistance(str1,b1,e1,str2,b2+1,e2);
    27             int t3 = CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
    28             return Math.min(Math.min(t1, t2), t3)+1;
    29         }
    30     }
    31     public static void main(String[] args) {
    32         String s1 = "xabcdae";
    33         String s2 = "xfdfa";
    34         System.out.println(s1+"与"+s2+"的距离为:"+CalculateStringDistance(s1,0,s1.length()-1,s2,0,s2.length()-1));
    35 
    36     }
    37 
    38 }

    程序运行结果如下:

    xabcdae与xfdfa的距离为:5

     下述代码清单3-6有误,最后的t1,t2,t3计算错误。

    改进后的程序如下:

     

     1 package chapter3jiegouzhifa.StringSimilarity;
     2 /**
     3  * 计算字符串的相似度
     4  * 【解法二】改进算法
     5  * 用空间换时间
     6  * @author DELL
     7  *
     8  */
     9 public class StringSimilarity2 {
    10     public static int CalculateStringDistance(String str1, int b1, int e1, String str2, int b2, int e2){
    11         int s[][][][] = new int[str1.length()+1][str1.length()][str2.length()+1][str2.length()];
    12         if(b1>e1){
    13             if(b2>e2)
    14                 return 0;
    15             else
    16                 return e2-b2+1;
    17         }
    18         if(b2>e2){
    19             if(b1>e1)
    20                 return 0;
    21             else
    22                 return e1-b1+1;
    23         }
    24         if(s[b1][e1][b2][e2]!=0)
    25             return s[b1][e1][b2][e2];
    26         else{
    27             if(str1.charAt(b1)==str2.charAt(b2)){            
    28                 s[b1][e1][b2][e2]=CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
    29                 return s[b1][e1][b2][e2];
    30             }else{
    31                 int t1,t2,t3;
    32                 if(s[b1+1][e1][b2][e2]!=0)
    33                     t1 = s[b1+1][e1][b2][e2];
    34                 else{
    35                     s[b1+1][e1][b2][e2] = CalculateStringDistance(str1,b1+1,e1,str2,b2,e2);
    36                     t1 = s[b1+1][e1][b2][e2];
    37                 }
    38                 if(s[b1][e1][b2+1][e2]!=0)
    39                     t2 = s[b1][e1][b2+1][e2];
    40                 else{
    41                     s[b1][e1][b2+1][e2] = CalculateStringDistance(str1,b1,e1,str2,b2+1,e2);
    42                     t2 = s[b1][e1][b2+1][e2];
    43                 }
    44                 if(s[b1+1][e1][b2+1][e2]!=0)
    45                     t3 = s[b1+1][e1][b2+1][e2];
    46                 else{
    47                     s[b1+1][e1][b2+1][e2] = CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
    48                     t3 = s[b1+1][e1][b2+1][e2];
    49                 }
    50                 s[b1][e1][b2][e2] = Math.min(Math.min(t1, t2), t3)+1;
    51                 return s[b1][e1][b2][e2];
    52             }
    53         }    
    54     }
    55     public static void main(String[] args) {
    56         String s1 = "xabcdae";
    57         String s2 = "xfdfa";
    58         System.out.println(s1+"与"+s2+"的距离为:"+CalculateStringDistance(s1,0,s1.length()-1,s2,0,s2.length()-1));
    59 
    60     }
    61 
    62 }

    程序运行结果如下:

    xabcdae与xfdfa的距离为:5
  • 相关阅读:
    kernel reported iSCSI connection 1:0 error (1022-Invalid or unknown error code) state (3)
    [Visual Studio] pdb 和 exe 不match的情况
    What is the Makefile Target `.c.o` for?
    [Inno Setup] 区分Windows版本的一个例子
    CFLAGS [Makefile]
    Python 安装第三方插件时,报错 unable to find vcvarsall.bat
    【Inno Setup】Windows 版本号
    正则应用
    正则search与match的区别
    还是正则基础
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4650569.html
Copyright © 2020-2023  润新知