求解兩個字串的最長公共子串行

2021-08-22 08:55:55 字數 2894 閱讀 8551

一,問題描述

給定兩個字串,求解這兩個字串的最長公共子串行(最長公共序列)比如字串1:bdcaba;字串2:abcbdab

則這兩個字串的最長公共子串行長度為4,最長公共子串行是:bcba

二,演算法求解

這是乙個動態規劃的題目對於可用動態規劃求解的問題,一般有兩個特徵:①最優子結構;②重疊子問題

①最優子結構

設x =(x1,x2,..... xn)和y = 是兩個序列,將x和y的最長公共子串行記為lcs(x ,y)

找出lcs(x,y)就是乙個

最優化問題

。因為,我們需要找到x和ý中

最長的

那個公共子串行。而要找x和ÿ的lcs,首先考慮x的最後乙個元素和ÿ的最後乙個元素。

1)如果xn = ym

,即x的最後乙個元素與y的最後乙個元素相同,這說明該元素一定位於公共子串行中。因此,現在只需要找:lcs(xn-1,ym-1)

lcs(xn-1,ym-1)就是原問題的

乙個

子問題。為什麼叫子問題?因為它的規模比原問題小。(小乙個元素也是小嘛....)

為什麼是最優的子問題?因為我們要找的是xn-1和ym-1的最長公共子串行啊......最長的!換句話說,就是最優的那個。(這裡的最優就是最長的意思)

2)如果xn!= ym

,這下要麻煩一點,因為它產生了

兩個

子問題:lcs(xn-1,ym)和lcs(xn,ym-1)

因為序列x和序列ý的最後乙個元素不相等嘛,說明那乙個求最後元素不可能的英文最長

公共

子串行中的元素嘛。(都不相等了,怎麼公共嘛)。

lcs(xn-1,ym)表示:最長公共序列可以在(x1,x2,...... x(n-1))和(y1,y2,... yn)中找。

lcs(xn,ym-1)表示:最長公共序列可以在(x1,x2,... xn)和(y1,y2,... y(n-1))中找。

求解上面兩個子問題,得到的公共子串行誰最長,那誰就是lcs(x,y)用數學表示就是:

lcs = max

由於條件1)和2)考慮到了所有可能的情況。因此,

我們成功地把原問題轉化成了三個規模更小的子問題

②重疊子問題

重疊子問題是啥?就是說原問題轉化成子問題後,子問題中有相同​​的問題。咦?我怎麼沒有發現上面的三個子問題中有相同​​的啊????

好的,來看看,原問題是:lcs(x,y)子問題有❶lcs(xn-1,ym-1)❷lcs(xn-1,ym)❸lcs(xn,ym-1)

初一看,這三個子問題是不重疊的可本質上它們是重疊的,因為它們只重疊了一大部分舉例:

第二個子問題:lcs(xn-1,ym)就包含了:問題❶lcs(xn-1,ym-1),為什麼?

因為,當xn-1和ym的最後乙個元素不相同時,我們又需要將lcs(xn-1,ym)進行分解:分解成:lcs(xn-1,ym-1)和lcs(xn-2 ),ym)

也就是說:子在問題的

繼續

分解中,有些問題是重疊的。

由於像lcs這樣的問題,它具有重疊子問題的性質,因此:用遞迴來求解就太不划算了因為採用遞迴,它重複地求解了子問題啊而且注意哦,所有子問題加起來的個數可是指數級的哦....

文章這篇

中就_ecshop演示了乙個遞迴求解重疊子問題的示例

。那麼問題來了,你說用遞迴求解,有指數級個子問題,故時間複雜度是指數級。這指數級個子問題,難道用了動態規劃,就變成多項式時間了?

呵呵噠....

關鍵是採用動態規劃時,並不需要去一一計算那些重疊了的子問題或者說

:用了動態規劃之後,有些子問題是通過「查表」直接得到的,而不是重新又計算一遍得到的廢話少說:舉個例子吧比如求蛋白原的數列關於纖維蛋白原的數列

,可參考:

求fib(5),分解成了兩個子問題:fib(4)和fib(3),求解fib(4)和fib(3)時,又分解了一系列的小問題....

從圖中可以看出:根的左右子樹:fib(4)和fib(3)下,是有很多重疊的!!!比如,對於fib(2),它就一共出現了三次

如果用遞迴來求解,fib(2)就會被計算三次,而用dp(動態規劃)動態規劃,則fib(2)只會計算一次,其他兩次則是通過「查表」直接求得。而且,更關鍵是是:查詢求得該問題的解之後,就不需要再繼續去分解該問題了而對於遞迴,是不斷地將問題分解,直到分解為基準問題(fib(1)或者fib(0))

說了這麼多,還是要寫下最長公共子串行的遞迴式才完整。借用網友的一張圖吧:)

c [i,j]表示:(x1,x2 .... xi)和(y1,y2 ... yj)的最長公共子串行的

長度

。(是長度哦,就是乙個整數嘛)。公式的具體解釋可參考「演算法導論」動態規劃章節

求解兩個字串的最長公共子串行

一,問題描述 給定兩個字串,求解這兩個字串的最長公共子串行 longest common sequence 比如字串1 bdcaba 字串2 abcbdab 則這兩個字串的最長公共子串行長度為4,最長公共子串行是 bcba 二,演算法求解 這是乙個動態規劃的題目。對於可用動態規劃求解的問題,一般有兩...

求解兩個字串的最長公共子串行

摘自 摘自 一,問題描述 給定兩個字串,求解這兩個字串的最長公共子串行 longest common sequence 比如字串1 bdcaba 字串2 abcbdab 則這兩個字串的最長公共子串行長度為4,最長公共子串行是 bcba 二,演算法求解 這是乙個動態規劃的題目。對於可用動態規劃求解的問...

求解兩個字串的最長公共子串

求解兩個字串的最長公共子串 比如字串1 helloworld 字串2 hloop 則這兩個字串的最長公共子串行長度為2,最長公共子串行是 lo 問題定義 lcs i j 為以s1 i 與s2 j 為結尾的的最長公共子串的長度 遞推公式 lcs xn,ym lcs xn 1,ym 1 1 if x n...