經典演算法題每日演練 第五題 字串相似度

2022-02-18 08:18:18 字數 1546 閱讀 2499

這篇我們看看最長公共子串行的另乙個版本,求字串相似度(編輯距離),我也說過了,這是乙個非常實用的演算法,在dna對比,網

頁聚類等方面都有用武之地。

一:概念

對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為「編輯距離」。

二:解析

可能大家覺得有點複雜,不好理解,我們試著把這個大問題拆分掉,將"字串 vs 字串「,分解成」字元 vs 字串「,再分解

成」字元 vs 字元「。

<1> 」字元「vs」字元「

這種情況是最簡單的了,比如」a「與」b「的編輯距離很顯然是1。

<2> 」字元」vs"字串"

」a「改成」ab「的編輯距離為1,「a」與「aba」的編輯距離為2。

<3>「字串」vs「字串」

「aba」和「bba」的編輯距離為1,仔細發現我們可以得出如下結論,」aba「是由23個子序列與」bba「字串求的的編輯距離集

子串行」a「和」bba「與」b「和」bba「之間的編輯距離中選出乙個最小值,然而序列a和序列b早之前我已經計算過了,這種重複計算

的問題有點像」斐波那契」,正好滿足「動態規劃」中的最優子結構和重疊子問題,所以我們決定採用動態規劃來解決。

三:公式

跟「最長公共子串行」一樣,我們採用乙個二維陣列來儲存字串x和y當前的位置的最小編輯距離。

現有兩個序列x=,y=,

設乙個c[i,j]: 儲存xi與yj的當前最小的ld。

①: 當 xi = yi 時,則c[i,j]=c[i-1,j-1];

②:當 xi != yi 時, 則c[i,j]=min;

最終我們的c[i,j]一直儲存著最小的ld。

四:**

1

using

system;23

namespace

4 和 的編輯距離為:\n

", str1, str2, ld());24}

25}2627

///28

///計算字串的編輯距離

29///

30///

31public

static

intld()

3238

39for (int j = 0; j <= str2.length; j++)

4043

44//

矩陣的 x 座標

45for (int i = 1; i <= str1.length; i++)

4655

else

5665}66

}6768//

返回字串的編輯距離

leetcode第五題 最長回文子字串

題目 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 中心擴充套件演算法 回文中心的兩側互為映象。因此,回文可以從它的中心展開,由於所含字母數為偶數的回文的中心...

經典演算法題每日演練 第十五題 並查集

這一篇我們看看經典又神奇的並查集,顧名思義就是並起來查,可用於處理一些不相交集合的秒殺。一 場景 有時候我們會遇到這樣的場景,比如 m n 我的需求就是判斷是否屬於同乙個集合,當然實現方法 有很多,一般情況下,普通青年會做出o mn 的複雜度,那麼有沒有更輕量級的複雜度呢?嘿嘿,並查集就是用來解決這...

經典演算法題每日演練 第十五題 並查集

原文 經典演算法題每日演練 第十五題 並查集 這一篇我們看看經典又神奇的並查集,顧名思義就是並起來查,可用於處理一些不相交集合的秒殺。一 場景 有時候我們會遇到這樣的場景,比如 m n 我的需求就是判斷是否屬於同乙個集合,當然實現方法 有很多,一般情況下,普通青年會做出o mn 的複雜度,那麼有沒有...