(java)字串的相似度
兩個字串的相似度定義為:將一個字串轉換成另外一個字串的代價(通過插入、刪除、替換三種方式轉換),轉換的代價越高則說明兩個字串的相似度越低。
如:snowy與sunny,轉換方式有
變換1:
S - N O W Y
S U N N - Y
Cost = 3 (插入U、替換O、刪除W)
變換2:
- S N O W - Y
S U N - - N Y
Cost = 5 (插入S、替換S、刪除O、刪除W、插入N)
對於多階段決策型別的問題,應該優先考慮動態規劃法(Dynamic Programming, DP)。
假設source字串有n個字元,target字串有m個字元,如果將問題定義為求解將source的1-n個字元轉換為target的1-m個字元所需要的最少編輯次數(最小編輯距離),則其子問題就可以定義為將source的1-i個字元轉換為target的1-j個字元所需要的最少編輯次數,這就是本問題的最優子結構。我們用d[i, j]表示source[1..i]到target[1..j]之間的最小編輯距離,則計算d[i, j]的遞推關係可以這樣計算出來:
如果source[i] 等於target[j],則:
d[i, j] = d[i-1, j-1] + 0 (1)
如果source[i] 不等於target[j],則根據插入、刪除和替換三個策略,分別計算出使用三種策略得到的編輯距離,然後取最小的一個:
d[i, j] = min(d[i, j - 1] + 1,d[i - 1, j] + 1,d[i - 1, j - 1] + 1 ) (2)
d[i, j - 1] + 1 表示對source[i]執行插入操作後計算最小編輯距離
d[i - 1, j] + 1 表示對source[i]執行刪除操作後計算最小編輯距離
d[i - 1, j - 1] + 1表示對source[i]替換成target[i]操作後計算最小編輯距離
d[i, j]的邊界值就是當target為空字串(m = 0)或source為空字串(n = 0)時所計算出的編輯距離:
m = 0,對於所有 i:d[i, 0] = i
n = 0,對於所有 j:d[0, j] = j
程式碼如下:
import java.util.Scanner;
public class Qiyone {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String source = in.next();
String target = in.next();
int i;
i = EditDistance(source, target);
System.out.println(i);
}
}
/**
* 採用動態規劃的方法解決
*
* @param source
* @param target
* @return
*/
private static int EditDistance(String source, String target) {
char[] sources = source.toCharArray();
char[] targets = target.toCharArray();
int sourceLen = sources.length;
int targetLen = targets.length;
int[][] d = new int[sourceLen + 1][targetLen + 1];
for (int i = 0; i <= sourceLen; i++) {
d[i][0] = i;
}
for (int i = 0; i <= targetLen; i++) {
d[0][i] = i;
}
for (int i = 1; i <= sourceLen; i++) {
for (int j = 1; j <= targetLen; j++) {
if (sources[i - 1] == targets[j - 1]) {
d[i][j] = d[i - 1][j - 1];
} else {
//插入
int insert = d[i][j - 1] + 1;
//刪除
int delete = d[i - 1][j] + 1;
//替換
int replace = d[i - 1][j - 1] + 1;
d[i][j] = Math.min(insert, delete) > Math.min(delete, replace) ? Math.min(delete, replace) :
Math.min(insert, delete);
}
}
}
return d[sourceLen][targetLen];
}
}
參考:
http://blog.csdn.net/hehe9737/article/details/7007079
http://blog.sina.com.cn/s/blog_757dbe67010172k1.html
相關推薦
Java程式碼實現餘弦相似度演算法比較兩字串相似度
因工作需要比較兩個兩個字串的相似度比較,由於最短編輯距離演算法不符合需求,就又找其他演算法,在網上看到了另一個演算法:餘弦相似度演算法。於是學習了一下,並寫篇部落格儲存,以便學習以及日後用到。 程式碼如下: import java.util.HashMap im
java實現編輯距離演算法,計算字串相似度
這是Levenshtein Distance演算法的java實現,另外oracle 10g r2當中好像自帶了這樣的函式,utl_match包當中public class LD { /** * 計算向量距離 * Levenshtein Distan
矩陣式比較兩文字字串相似度(包含漢字)方法兩則(java程式碼)
package com.gsww.ctyxy.util; import java.text.NumberFormat; import java.util.Locale; /** * 比較兩個字串的相似度 */ public class AutomaticRating { /* pu
判斷兩字串相似度
/** * <h5>功能:判斷兩字串相似度(最小為0,最大為1)</h5> * * @param strOne * @param strTwo * @return 兩字串相似度(最小為0,最大為1) */ public static double SimlaritySt
字串相似度演算法
字串相似度演算法 一、百度百科 二、用途 三、實現過程 四、JAVA程式碼實現 五、原理 六、結束語 一、百度百科 Levenshtein 距離,又稱編輯距離,指的是兩個字串之間,由一個轉換
計算字串相似度的一些方法
產品出了一個奇怪的需求,想通過字串相似度取匹配城市= =(當然,最後證實通過字串相似度取判斷兩個字串是不是一個城市是不對的!!!) 這裡就記錄一下我計算字串(英文字串)相似度的方法吧~ 參考文件: L
簡單的字串相似度匹配加排序
今天遇到一個問題,需要將一組字串,跟結果需要的字串相比較,根據相似性排列出來,思考了一個下午,想了一個簡易的匹配演算法,寫出程式碼的時候下班了,回家除錯了幾次後就成功了,特此將該演算法寫出來。 思路:將一組字串儲存到list中,用兩個for迴圈,先
python比較字串相似度
python自帶比較相似度的模組,difflib。比較兩個字串的模組是difflib.SequenceMatcher,使用起來很簡單: import difflibdef string_similar(s1, s2): return difflib.SequenceMatcher(None,
字串相似度演算法(編輯距離演算法 Levenshtein Distance)
在搞驗證碼識別的時候需要比較字元程式碼的相似度用到“編輯距離演算法”,關於原理和C#實現做個記錄。 據百度百科介紹: 編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可
演算法介紹(3) 編輯距離演算法-字串相似度
編輯距離,又稱Levenshtein距離,是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。 具體的操作方法為:
LeetCode之計算字串相似度或編輯距離EditDistance
問題描述: /** * Given two words word1 and word2, find the minimum number of steps required to * convert word1 to word2. (each oper
求解字串間最短距離(字串相似度)
問題描述: 給定任意兩個字串,比如:str1=“abcd”和str2=“gbcdz”,計算這兩個字串間的相似度。計算兩字串的相似度可等價於計算將str1變換到str2所需要的最少步驟。 問題分析: 為計算將str1變換到str2所需最小操作步驟,必須先對變
相似URL判定及字串相似度距離
相似URL判定 edit distance缺點 基於結構來判斷URL相似度,去掉數字。字串是否也需要去掉自身只保留結構,或者保留存在長度的結構,可以根據情況來靈活取捨。 抽象一下特徵 1、站點特徵:如果兩個url站點一樣,則特徵取值1,否則取值0; 2、
Oracle字串相似度查詢
Oracle字串相似度查詢 參考地址:https://www.cnblogs.com/lytwajue/p/6812556.html Oracle函式: SYS.UTL_MATCH.EDIT_DISTANCE_SIMILARITY(str,patternStr) SQL示例: SELECT e.*,S
計算字串相似度
問題描述:有兩個不同的字串,通過使用一套操作方法可以把兩個字串變成一樣的。 例如: 1) "a" 和 "b" ==> 把a變成b,或把b變成a 變化了一次 2) "abc" 和 "ade" ==> 把bc變成de,或把de變成bc 變化了兩次
Python字串相似度檢測
有個字串相似度檢測的庫,difflib。 query_str = '市公安局' s1 = '廣州市郵政局' s2 = '廣州市公安局' s3 = '廣州市檢查院' print(difflib.Seq
C#:字串相似度演算法( Levenshtein Distance演算法)
編輯距離,又稱Levenshtein距離(也叫做Edit Distance),是指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。許可的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。 網上有很多關於此演算法的原始碼,但其中一些存在Bug,如百度搜索
計算兩個字串相似度的演算法
該方法是使用的Levenshtein演算法的一個實現。 簡單介紹下Levenshtein Distance(LD):LD 可能衡量兩字串的相似性。它們的距離就是一個字串轉換成那一個字串過程中的新增、刪除、修改數值。 舉例: 如果str1="test",st
C字串相似度計算
#region 計算相似度 /// <summary> /// 取最小的一位數 /// </summary> /// <param name="first"><
Java字串匹配相似度演算法
/** * 採用動態規劃的方法(字串匹配相似度) * @param source 源 * @param target 要匹配的字串 * @return */ public static int EditDistance(String