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入门到精通教程
查看: 754|回复: 0

java计算两字符串之间的距离 实例

[复制链接]

该用户从未签到

发表于 2011-9-18 13:18:38 | 显示全部楼层 |阅读模式
简单介绍下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]

import java.util.*;
public   class Main{   
   
static  int min(int one, int two, int three) {
        int min = one;
        if(two < min) {
            min = two;
        }
        if(three < min) {
            min = three;
        }
        return min;
    }
   
    static  int ld(String str1, String str2) {
        int d[][];    //矩阵
        int n = str1.length();
        int m = str2.length();
        int i;    //遍历str1的
        int j;    //遍历str2的
        char ch1;    //str1的
        char ch2;    //str2的
        int temp;    //记录相同字符,在某个矩阵位置值的增量,不是0就是1
        if(n == 0) {
            return m;
        }
        if(m == 0) {
            return n;
        }
        d = new int[n+1][m+1];
        for(i=0; i<=n; i++) {    //初始化第一列
            d[0] = i;
        }
        for(j=0; j<=m; j++) {    //初始化第一行
            d[0][j] = j;
        }
        for(i=1; i<=n; i++) {    //遍历str1
            ch1 = str1.charAt(i-1);
            //去匹配str2
            for(j=1; j<=m; j++) {
                ch2 = str2.charAt(j-1);
                if(ch1 == ch2) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                //左边+1,上边+1, 左上角+temp取最小
                d[j] = min(d[i-1][j]+1, d[j-1]+1, d[i-1][j-1]+temp);
            }
        }
        return d[n][m];
    }
     public static void main(String[] args) {
        
        String str1 = "chenlb.blogjava.net";
        String str2 = "chenlb.javaeye.com";
        System.out.println("ld="+ld(str1, str2));
    }
   
}  
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 02:27 , Processed in 0.298625 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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