java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】

编辑距离算法其实就是,在规定的编辑操作(替换字符串、插入字符串、删除字符串)中,经过几步可以把一个字符串变成另一个字符串,而这个所需的步数就是你的编辑距离。

测试样例:

str1 = abc

str2 = yabd

表里的每一个值都代表着将str1转换成str2所需要的步数,每个单元格的值都遵循这样一个规律,第一行和第一列都是从0到n;其他的值要分情况计算,行索引和列索引对比大小,相同的话直接取左上方单元格的值,不同的话对比其左上方、左边、上边,找到三个单元格之中的最小值再加1即这个单元格的值。

str1abc
str2
0123
y1123
a2123
b3212
d4332

最后一个单元格的值就是两个字符串间不同字符的个数,利用这个数与两个字符串中最长的长度相除就得到了不相似的程度,再用1减去就是相似率。

public class FileCompared {public static void main(String[] args) {String str1 = "ABCDEFGZ";String str2 = "ABFDFEGXY";System.out.println("两个字符串的相似率为:" + similarRates(str1,str2) +"%");}//定义一个similarRates方法获取两个字符串间不同字符的个数并求出两个字符串的相似率public static int similarRates(String str1 , String str2){//确定二维距离表distance的维度int str1Len = str1.length();int str2Len = str2.length();//如果一个字符串的内容为空就返回另一个字符串的长度if (str1Len == 0) return str2Len;if (str2Len == 0) return str1Len;//定义一张二维距离表distanceint[][] distance = new int[str1Len + 1][str2Len + 1];//给二维数组的第一行第一列赋值int maxLen = str1Len > str2Len ? str1Len : str2Len;for (int num = 0; num < maxLen + 1; num++){if (num<str1Len + 1) distance[num][0] = num;if (num<str2Len + 1) distance[0][num] = num;}/*** 补全二维数组除第一行第一列的其他值* 行列索引进行对比,相同的话直接取左上方值,不同的话采用最小距离算法*/for (int row = 1; row < str1Len+1; row++){char c1 = str1.charAt(row - 1);for (int col = 1; col < str2Len+1; col++){char c2 = str2.charAt(col - 1);if (c1 == c2) {distance[row][col] = distance[row - 1][col - 1];} else {// 最小距离算法就是,取该元素左上方值、左边值、上边值,找到三个之中的最小值再加1即最终距离distance[row][col] = mostMin(distance[row-1][col], distance[row][col-1], distance[row-1][col-1]) + 1;}}}//二维数组中的最后一个元素即是两个字符串间不同字符的个数int notSimilarNum = distance[str1Len][str2Len];//求出相似率double similarRates = (1- (double)notSimilarNum / maxLen)*100;return (int)similarRates;}//取三个数中的最小值public static int mostMin(int up, int left, int upLeft){int min = up < left ? up : left;min = min < upLeft ? min : upLeft;return min;}
}

如此便求出了两个字符串的相似率,字符串换成读取文件的话就可以得到两个文件的相似度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java从入门到头秃专栏 】(一)学在Java语法之前

目录 1 初识Java 2 Java环境JDK 3 Java规范 1 初识Java Java是美国的sun(Stanford University Network)公司在1995年推出的一门计算机高级编程语言&#xff0c;虽然说当时参与开发Java的人员有好几名&#xff0c;但是业内公认的Java之父是詹姆斯高斯林(James Gosling)。 Jav…

【Java从入门到头秃专栏 】(二) 注释 数据类型 变量 常量 关键字 标识符 运算符 输入输出

目录 1 注释 2 数据类型 3 变量与常量 4 关键字、标识符 5 运算符 6 键入值、输出值 1 注释 注释就是写在程序中对代码进行解释说明的文字&#xff0c;方便自己和其他人查看&#xff0c;以便大家更加容易理解程序。注释虽然写在程序中&#xff0c;但是并不参与程序的执行&#…

【Java从入门到头秃专栏 】(三) 控制流程 Math Date DateFormat Calendar System BigDecimal Random

目录 1 控制流程 2 Math类 3 Date类 4 DateFormat类 5 Calendar类(日历类) 6 System类 7 BigDecimal类 8 Random类(随机数) 1 控制流程 1.1 块作用域 块(即复合语句)就是指由若干条Java语句组成的语句&#xff0c;并用一条大括号括起来&#xff0c;并借此形式确定了变量…

IntelliJ IDEA最常用的一些快捷键,学会了室友还以为你在祖安对线

目录 1 快速生成语句 1.1 main语句 1.2 输出语句 1.3 流程控制语句 1.3.1 if判断语句 1.3.2 while循环 1.3.3 for循环 1.3.4 数组、集合的循环操作 1.3.5 迭代器循环操作 1.4 对象实例化、定义变量 1.5 try-catch异常 2 快捷键 2.1 Ctrl系列 2.2 alt系列 2.2.1…

【Java从入门到头秃专栏 6】语法篇(五) :多线程 线程池 可见、原子性 并发包 Lambda表达式

目录 1 多线程 1.1 基本概念 1.2 创建线程的三种方式 1.4 解决线程安全问题的三种方法 1.5 线程通信 1.6 线程状态 2 线程池 2.1线程池的概念 2.2 创建并提交任务 3 可见性 3.1 变量不可见性 3.2 变量不可见性的解决方案 4 原子性 4.1 原子性的概念 4.2 保证原…

【Java从入门到头秃专栏 7】语法篇(六) :Lambda表达式(->) 方法引用(::) stream流

目录 1 Lambda表达式( -> ) ​ 2 方法引用( :: ) 3 Stream流 接下来介绍的三种语法叫&#xff1a;Lambda表达式 方法引用 stream流&#xff0c;这三种语法的使用要有特定条件&#xff0c;在一定条件下借助这三种语法可以使代码十分简单且优雅&#xff0c;但是不要舍本逐末…

【Java从入门到头秃专栏 4】语法篇(三) :字符串 数组

目录 1 String字符串 2 数组 1 String字符串 Java没有内置的字符串类型&#xff0c;而是在Java类库中提供了一个预定义类--String。 在Java中把每一个使用双引号括起来的字符串都看做是String类的一个实例化对象。 String常被称作是不可变字符串类型&#xff0c;那么有人就有…

【Java从入门到头秃专栏 8】语法篇(七) :反射 动态代理 注解

目录 1 反射机制 2 反射的应用&#xff1a;动态代理 3 注解 1 反射机制 反射机制(Reflect Machanism)&#xff0c;是指在程序运行期间借助Reflect API获取任何类的内部信息&#xff0c;并能直接操作对象的内部属性以及方法&#xff0c;Java本身而言是静态语言但是由于Java反…

【SSM面向CRUD编程专栏 1】Spring简介 xml配置文件 依赖注入 数据注入

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 2】Spring相关API 数据源(连接池)的配置 注解开发 整合junit

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 4】 Spring集成web环境 SpringMVC初识

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; ​…

IntelliJ IDEA里的项目搞崩了怎么办,本地历史版本回退拯救你崩溃的心灵

&#x1f4a5;写在前面&#xff1a; 如果你还没有读过雨果的悲惨世界也没有读过余华的活着&#xff0c;那你可以看看我今天早上的经历&#xff0c;如果不想听我胡侃的话&#xff0c;直接进入正题&#xff1a; 目录 本地历史的强大 今天早上打开IntelliJ IDEA继续ssm模块的代码练…

【SSM面向CRUD编程专栏 5】使用SpringMVC进行数据响应以及获取请求数据

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 6】springMVC拦截器、异常处理 jdbcTemplate

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 7】springAop 事务控制

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 8】一篇博客快速上手使用MyBatis进行CRUD

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

【SSM面向CRUD编程专栏 9】SSM框架整合

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

三万字速通SSM框架入门知识点,快速上手CRUD

&#x1f6eb;更多ssm知识见SSM_面向CRUD编程专栏 &#x1f695;本博客总结自黑马程序员的ssm框架视频 &#x1f692;博主对于该知识尚在学习阶段 &#x1f684;如果发现存在问题请毫不吝啬的指出 &#x1f680;&#x1f680;扎哇太枣糕的博客主页&#x1f680;&#x1f680; 目…

无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

问题简介 本人是在进行一个ssm框架项目的编写的时候&#xff0c;在数据库中查询到所有的商品信息并返回到页面使用EL表达式进行展现&#xff0c;但是使用tomcat 9.0.58运行的时候报错会出现以下报错情况。 页面报错&#xff1a; 控制台报错&#xff1a; 解决方法 首先看看是不…

check the manual that corresponds to your MySQL server version for the right syntax to use near

首先判断自己是在什么情况下报的错&#xff0c;如果是MyBatis的SQL报错的话&#xff0c;建议直接点击目录跳转到MyBatis时SQL报错&#xff0c;避免浪费时间。如果本文能够对你有所帮助的话&#xff0c;还请在评论区多多支持 目录 &#x1f37b;运行SQL语句、SQL文件等报错 &…