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.pswp.cn/news/535138.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535138.shtml
英文地址,請注明出處:http://en.pswp.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文件等報錯 &…