最長公共子串行(不是子串)

2021-06-25 07:43:13 字數 2970 閱讀 6299

**實現:

public class lcs 

for(int i=0; i<=n; i++)

for(int i=0; i

下文**:

一: 作用

最長公共子串行的問題常用於解決字串的相似度,是乙個非常實用的演算法,作為碼農,此演算法是我們的必備基本功。

二:概念

舉個例子,cn

blogs這個字串中子序列有多少個呢?很顯然有27個,比如其中的cb,cgs等等都是其子序列,我們可以看出

子串行不見得一定是連續的,連續的那是子串。

我想大家已經了解了子串行的概念,那現在可以延伸到兩個字串了,那麼大家能夠看出:cnblogs和belong的公共子串行嗎?

在你找出的公共子串行中,你能找出最長的公共子串行嗎?

從圖中我們看到了最長公共子串行為blog,仔細想想我們可以發現其實最長公共子串行的個數不是唯一的,可能會有兩個以上,

但是長度一定是唯一的,比如這裡的最長公共子串行的長度為4。

三:解決方案

<1> 列舉法

這種方法是最簡單,也是最容易想到的,當然時間複雜度也是龜速的,我們可以分析一下,剛才也說過了cnblogs的子串行

個數有27個 ,延伸一下:乙個長度為n的字串,其子序列有2n個,每個子串行要在第二個長度為n的字串中去匹配,匹配一次

需要o(n)的時間,總共也就是o(n*2n),可以看出,時間複雜度為指數級,恐怖的令人窒息。

<2> 動態規劃

既然是經典的題目肯定是有優化空間的,並且解題方式是有固定流程的,這裡我們採用的是矩陣實現,也就是二維陣列。

第一步:先計算最長公共子串行的長度。

第二步:根據長度,然後通過回溯求出最長公共子串行。

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

設乙個c[i,j]: 儲存xi與yj的lcs的長度。

遞推方程為:

不知道大家看懂了沒?動態規劃的乙個重要性質特點就是解決「子問題重疊」的場景,可以有效的避免重複計算,根據上面的

公式其實可以發現c[i,j]一直儲存著當前(xi,yi)的最大子串行長度。

圖大家可以自己畫一畫,**完全是根據上面的公式照搬過來的,長度的問題我們已經解決了,這次要解決輸出最長子序列的問題,

我們採用乙個標記函式flag[i,j],當

①:c[i,j]=c[i-1,j-1]+1  時 標記flag[i,j]="left_up";    (左上方箭頭)

②:c[i-1,j]>=c[i,j-1]   時 標記flag[i,j]="left";          (左箭頭)

③: c[i-1,j]

例如:我輸入兩個序列x=acgbfhk,y=cegefkh。

1

using

system;23

namespace428

29static

void lcs(string str1, string

str2)

3049

else

5057

else

5862}63

}64}65

}6667static

void subsequence(int i, int

j)68

: 當前座標:(,)

", str2[j - 1], i - 1, j - 1

);75

76//

左前方77 subsequence(i - 1, j - 1

由於直接繪圖很麻煩,嘿嘿,我就用手機拍了張:

好,我們再輸入兩個字串:

通過上面的兩張圖,我們來分析下它的時間複雜度和空間複雜度。

時間複雜度:構建矩陣我們花費了o(mn)的時間,回溯時我們花費了o(m+n)的時間,兩者相加最終我們花費了o(mn)的時間。

空間複雜度:構建矩陣我們花費了o(mn)的空間,標記函式也花費了o(mn)的空間,兩者相加最終我們花費了o(mn)的空間。

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...