转载自: https://blog.csdn.net/JavaReact/article/details/82144732

算法简介:

Levenshtein Distance,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。

许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

  1.  
    /**
  2.  
    * 比较两个字符串的相识度
  3.  
    * 核心算法:用一个二维数组记录每个字符串是否相同,如果相同记为0,不相同记为1,每行每列相同个数累加
  4.  
    * 则数组最后一个数为不相同的总数,从而判断这两个字符的相识度
  5.  
    *
  6.  
    * @param str
  7.  
    * @param target
  8.  
    * @return
  9.  
    */
  10.  
    private static int compare(String str, String target) {
  11.  
    int d[][]; // 矩阵
  12.  
    int n = str.length();
  13.  
    int m = target.length();
  14.  
    int i; // 遍历str的
  15.  
    int j; // 遍历target的
  16.  
    char ch1; // str的
  17.  
    char ch2; // target的
  18.  
    int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
  19.  
    if (n == 0) {
  20.  
    return m;
  21.  
    }
  22.  
    if (m == 0) {
  23.  
    return n;
  24.  
    }
  25.  
    d = new int[n + 1][m + 1];
  26.  
    // 初始化第一列
  27.  
    for (i = 0; i <= n; i++) {
  28.  
    d[i][0] = i;
  29.  
    }
  30.  
    // 初始化第一行
  31.  
    for (j = 0; j <= m; j++) {
  32.  
    d[0][j] = j;
  33.  
    }
  34.  
    for (i = 1; i <= n; i++) {
  35.  
    // 遍历str
  36.  
    ch1 = str.charAt(i - 1);
  37.  
    // 去匹配target
  38.  
    for (j = 1; j <= m; j++) {
  39.  
    ch2 = target.charAt(j - 1);
  40.  
    if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) {
  41.  
    temp = 0;
  42.  
    } else {
  43.  
    temp = 1;
  44.  
    }
  45.  
    // 左边+1,上边+1, 左上角+temp取最小
  46.  
    d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp);
  47.  
    }
  48.  
    }
  49.  
    return d[n][m];
  50.  
    }
  51.  
     
  52.  
     
  53.  
    /**
  54.  
    * 获取最小的值
  55.  
    */
  56.  
    private static int min(int one, int two, int three) {
  57.  
    return (one = one < two ? one : two) < three ? one : three;
  58.  
    }
  59.  
     
  60.  
    /**
  61.  
    * 获取两字符串的相似度
  62.  
    */
  63.  
    public static float getSimilarityRatio(String str, String target) {
  64.  
    int max = Math.max(str.length(), target.length());
  65.  
    return 1 - (float) compare(str, target) / max;
  66.  
    }
  1.  
    public static void main(String[] args) {
  2.  
    String a= "Steel";
  3.  
    String b = "Steel Pipe";
  4.  
    System.out.println("相似度:"+getSimilarityRatio(a,b));
  5.  
    }

算法原理:

该算法的解决是基于动态规划的思想,具体如下: 
设 s 的长度为 n,t 的长度为 m。如果 n = 0,则返回 m 并退出;如果 m=0,则返回 n 并退出。否则构建一个数组 d[0..m, 0..n]。 
将第0行初始化为 0..n,第0列初始化为0..m。 
依次检查 s 的每个字母(i=1..n)。 
依次检查 t 的每个字母(j=1..m)。 
如果 s[i]=t[j],则 cost=0;如果 s[i]!=t[j],则 cost=1。将 d[i,j] 设置为以下三个值中的最小值: 
紧邻当前格上方的格的值加一,即 d[i-1,j]+1 
紧邻当前格左方的格的值加一,即 d[i,j-1]+1 
当前格左上方的格的值加cost,即 d[i-1,j-1]+cost 
重复3-6步直到循环结束。d[n,m]即为莱茵斯坦距离。

参考链接:

http://wdhdmx.iteye.com/blog/1343856

https://www.cnblogs.com/ymind/archive/2012/03/27/fast-memory-efficient-Levenshtein-algorithm.html

https://blog.csdn.net/u013035314/article/details/50340443

Java 比较两个字符串的相似度算法(Levenshtein Distance)的更多相关文章

  1. 字符串相似度算法——Levenshtein Distance算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  2. 字符串相似度算法-LEVENSHTEIN DISTANCE算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  3. 利用编辑距离(Edit Distance)计算两个字符串的相似度

    利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...

  4. C# 计算两个字符串的相似度

    我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. 现在提供一个比较两个字符串相似度的方法. 通过计算出两个字符串的相似度,就可以通过Linq在内 ...

  5. Levenshtein Distance + LCS 算法计算两个字符串的相似度

    //LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source ...

  6. C#比较两个字符串的相似度【转】

    原文地址:http://www.2cto.com/kf/201202/121170.html 我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能. ...

  7. Java计算两个字符串日期之间的天数差

    Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException { String a = ...

  8. python利用difflib判断两个字符串的相似度

    我们再工作中可能会遇到需要判断两个字符串有多少相似度的情况(比如抓取页面内容存入数据库,如果相似度大于70%则判定为同一片文章,则不录入数据库) 那这个时候,我们应该怎么判断呢? 不要着急,pytho ...

  9. java比较两个字符串是否相等

    从c 到c++ 到 c# 到 JavaScript  判断两个字符串是否相等,用==号都可以.奇葩的java怎么可以只能用equals()这个函数.只是因为String是引用类型吗??!!哭笑不得.. ...

随机推荐

  1. iTop4412开发板+虚拟机+tftp服务

    感觉好坑啊 利用路由器+2根网线+tftp服务 首先是开发板,主机,虚拟机相互之间能ping通(坑), 关闭主机防火墙,防止被强 关闭虚拟机防火墙 虚拟机装上tftpd服务端(通过网上教程嘛) 是不是 ...

  2. Java中接口是否可以继承多个接口?

    可以. 接口是常量值和方法定义的集合.接口是一种特殊的抽象类. java类是单继承的.classB Extends classA java接口可以多继承.Interface3 Extends Inte ...

  3. 第四章、前端之BOM和DOM

    目录 第四章.前端之BOM和DOM 一.解释BOM和DOM 二.window对象 三.window子对象 四.弹出框 五.计时相关 六.HTML的DOM树 七.查找元素 八.节点操作 九.JS操作CS ...

  4. shell脚本——字符串

    printf printf "%-10s %-10s %-10s\n" NO Name    Height printf "%-10s %-10s %-10d\n&quo ...

  5. Jenkins服务器安装与配置

    Jenkins是一个非常出色的持续集成服务器,本文主要介绍在CentOS系统中Jenkins的基本安装配置方法,供参考. 一. 软件包: 1. 下载apache-maven-2.2.1-bin.tar ...

  6. MySQL跨表更新SQL

    1 sql范式  把s表中的city_name的值设置为city表中的name,关联条件是city_code 和 code update student s, city c set s.city_na ...

  7. Lambda表达式语法进一步巩固

    上一次已经初步使用到了Lambda表达式了,这次再次对它的语法进行一下巩固,因为它实在是太重要的,所以多花时间彻底理解它是非常有必要的. 在"Java8 in Action"一书中 ...

  8. iview 表单验证不通过问题?

    项目需要,需要怂iview..使用一段时间感觉跟elementUI用起来差不多很方便.使用过程中遇到表单验证问题,如何避免在验证过程中偶尔出现验证不通过的异常情况? <1>:给 <F ...

  9. exec sp_executesql 比直接执行SQL慢,而且消耗大量资源问题

    今天SqlServer数据库出现了访问不通的情况,抓紧重启了下服务,让大家先恢复使用,然后我开了 SQL Server Profiler 看看是不是存在性能问题SQL,然后就发现一批这样的SQL,看r ...

  10. 【转载】总结:几种生成HTML格式测试报告的方法

    总结:几种生成HTML格式测试报告的方法 写自动化测试时,一个很重要的任务就是生成漂亮的测试报告. 1.用junit或testNg时,可以用ant辅助生成html格式: <target name ...