1. levenshtein distance
該演算法又稱之為 "編輯距離",用於計算兩個字串的相似程度。原理很簡單,就是返回將第乙個字串轉換(刪除、插入、替換)成第二個字串的編輯次數。次數越少,意味著字串相似度越高。
演算法原理:wikipedia - levenshtein distance
本文摘自:
step1:
人 民 共 和 時 代
0, 0, 0, 0, 0, 0, 0
中 1, 0, 0, 0, 0, 0, 0
華 2, 0, 0, 0, 0, 0, 0
人 3, 0, 0, 0, 0, 0, 0
民 4, 0, 0, 0, 0, 0, 0
共 5, 0, 0, 0, 0, 0, 0
和 6, 0, 0, 0, 0, 0, 0
國 7, 0, 0, 0, 0, 0, 0
step2:
人 民 共 和 時 代
0, 1, 2, 3, 4, 5, 6
中 1, 0, 0, 0, 0, 0, 0
華 2, 0, 0, 0, 0, 0, 0
人 3, 0, 0, 0, 0, 0, 0
民 4, 0, 0, 0, 0, 0, 0
共 5, 0, 0, 0, 0, 0, 0
和 6, 0, 0, 0, 0, 0, 0
國 7, 0, 0, 0, 0, 0, 0
step3:
人 民 共 和 時 代
0, 1, 2, 3, 4, 5, 6
中 1, 1, 2, 3, 4, 5, 6
華 2, 2, 2, 3, 4, 5, 6
人 3, 2, 3, 3, 4, 5, 6
民 4, 3, 2, 3, 4, 5, 6
共 5, 4, 3, 2, 3, 4, 5
和 6, 5, 4, 3, 2, 3, 4
國 7, 6, 5, 4, 3, 3,4
演算法實現:
public static int levenshteindistance(string s1, string s2)
}
return d[m - 1, n - 1];
}
2. lcs
lcs (longest common subsequence) 演算法用於找出兩個字串最長公共子串。
演算法原理:
(1) 將兩個字串分別以行和列組成矩陣。
(2) 計算每個節點行列字元是否相同,如相同則為 1。
(3) 通過找出值為 1 的最長對角線即可得到最長公共子串。
人 民 共 和 時 代
中 0, 0, 0, 0, 0, 0
華 0, 0, 0, 0, 0, 0
人1, 0, 0, 0, 0, 0
民 0,1, 0, 0, 0, 0
共 0, 0,1, 0, 0, 0
和 0, 0, 0,1, 0, 0
國 0, 0, 0, 0, 0, 0
為進一步提公升該演算法,我們可以將字元相同節點(1)的值加上左上角(d[i-1, j-1])的值,這樣即可獲得最大公用子串的長度。如此一來只需以行號和最大值為條件即可擷取最大子串。
人 民 共 和 時 代
中 0, 0, 0, 0, 0, 0
華 0, 0, 0, 0, 0, 0
人1, 0, 0, 0, 0, 0
民 0,2, 0, 0, 0, 0
共 0, 0,3, 0, 0, 0
和 0, 0, 0,4, 0, 0
國 0, 0, 0, 0, 0, 0
演算法實現:
public static string lcs(string s1, string s2)
}
}
return s1.substring(index - length + 1, length);
}
完
最大公共字串
簡單dp問題 設兩個字串s1,s2,假設dp i j 代表到s1的第i個字元及s2的第j個字元時,最大公共字串的數目 那麼 if s1 i s2 j dp i j d i 1 j 1 1 else dp i j 0 如下 dp二維陣列空間是可以優化的,可以變成一位陣列.dp是個二維矩陣,舉例如下 a...
最大公共字串
最簡單的方法就是依次比較,以某個串為母串,然後生成另乙個串的所有長度的子串,依次去母串中比較查詢,這裡可以採用先從最長的子串開始,減少比較次數,但是複雜度依然很高!然後重新看一下這個問題,我們建立乙個比較矩陣來比較兩個字串str1和str2 定義lcs i,j 當str1 i str2 j 時lcs...
最大公共字串
a i 1 j 1 1最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的...