Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 535|回复: 0

[算法学习]计算两字符串之间的距离

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-30 00:06:58 | 显示全部楼层 |阅读模式
    简单介绍下Levenshtein Distance(LD)
        对于两个不同的字符串,我们有一套操作方法来把他们变得相同,具体方法为:

    修改一个字符(如把“a”替换为“b”)
    删除一个字符(如把“traveling”变为“travelng”)    比如对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g”的方式来达到目的。 无论增加还是减少“g”,我们都仅仅需要一次操作。我们把这个操作所需要的次数定义为两个字符串的距离Levenshtein Distance(LD)。   Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。  
      
       
       
         
       

         
       
      
    Levenshtein distance可以用来:  * Spell checking(拼写检查)
    * Speech recognition(语句识别)
    * DNA analysis(DNA分析)
    * Plagiarism detection(抄袭检测) LD用m*n的矩阵存储距离值。算法大概过程:  1. str1或str2的长度为0返回另一个字符串的长度。
    2. 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
    3. 扫描两字符串(n*m级的),如果:str1 == str2[j],用temp记录它,为0。否则temp记为1。
    然后在矩阵d[j]赋于d[i-1][j]+1 、d[j-1]+1、d[i-1][j-1]+temp三者的最小值。
    4. 扫描完后,返回矩阵的最后一个值即d[n][m]
    1. import java.util.*;
    2. public   class Main{   
    3.    
    4. static  int min(int one, int two, int three) {
    5.         int min = one;
    6.         if(two < min) {
    7.             min = two;
    8.         }
    9.         if(three < min) {
    10.             min = three;
    11.         }
    12.         return min;
    13.     }
    14.    
    15.     static  int ld(String str1, String str2) {
    16.         int d[][];    //矩阵
    17.         int n = str1.length();
    18.         int m = str2.length();
    19.         int i;    //遍历str1的
    20.         int j;    //遍历str2的
    21.         char ch1;    //str1的
    22.         char ch2;    //str2的
    23.         int temp;    //记录相同字符,在某个矩阵位置值的增量,不是0就是1
    24.         if(n == 0) {
    25.             return m;
    26.         }
    27.         if(m == 0) {
    28.             return n;
    29.         }
    30.         d = new int[n+1][m+1];
    31.         for(i=0; i<=n; i++) {    //初始化第一列
    32.             d[i][0] = i;
    33.         }
    34.         for(j=0; j<=m; j++) {    //初始化第一行
    35.             d[0][j] = j;
    36.         }
    37.         for(i=1; i<=n; i++) {    //遍历str1
    38.             ch1 = str1.charAt(i-1);
    39.             //去匹配str2
    40.             for(j=1; j<=m; j++) {
    41.                 ch2 = str2.charAt(j-1);
    42.                 if(ch1 == ch2) {
    43.                     temp = 0;
    44.                 } else {
    45.                     temp = 1;
    46.                 }
    47.                 //左边+1,上边+1, 左上角+temp取最小
    48.                 d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);
    49.             }
    50.         }
    51.         return d[n][m];
    52.     }
    53.      public static void main(String[] args) {
    54.         
    55.         String str1 = "chenlb.blogjava.net";
    56.         String str2 = "chenlb.javaeye.com";
    57.         System.out.println("ld="+ld(str1, str2));
    58.     }
    59.    
    60. }   
    复制代码




      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/30/000657671.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 04:18 , Processed in 0.360145 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表