LCS小結(O O 吽吽)

2022-05-30 04:15:14 字數 1566 閱讀 8225

lcs

最長公共子串行也稱作最長公共子串(不要求連續),打個比方說,a君有乙個字串:qazwbx,b君也有乙個字串:azwsxq,那麼我們可以說a君和b君的最長公共子串行為:azwx

,長度為4,這樣看來好像挺簡單的,但是如果字串很長或者比較的字串個數很多,要求出公共的而且是最長的就能比較困難了,為了方便小盆友們方便的求得 最長公共子串行,我們引入高大上的dp君!

這裡我們採用的是矩陣實現,也就是二維陣列。

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

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

先來實現第一步吧:

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

設x = ,y = 及它們的最長子序列z = 則:

1、若 xm = yn , 則 zk = xm = yn,且z[k-1] 是 x[m-1] 和 y[n-1] 的最長公共子串行

2、若 xm != yn ,且 zk != xm , 則 z 是 x[m-1] 和 y 的最長公共子串行

3、若 xm != yn , 且 zk != yn , 則 z 是 y[n-1] 和 x 的最長公共子串行

子問題的遞迴結構:

當 i = 0 , j = 0 時 , c[i][j] = 0

當 i , j > 0 ; xi = yi 時 , c[i][j] = c[i-1][j-1] + 1

當 i , j > 0 ; xi != yi 時 , c[i][j] = max

下面的**是求兩個字串的最長公共子串:

1

int lcs(int n,int

m)//n,m分別為兩個字串的長度210

for(i=1;i<=n;i++)

1118

else

1922}23

}24return

dp[n][m];

25 }

第二步:通過回溯求出最長公共子串行

如圖:下面給出逆序輸出最長公共子串的**:

從最後開始,碰到一樣的輸出,不一樣的,往更大的方向跑。其實就是前面生成dp的逆過程。

lcs粗略的講完了,還有很多不足,希望大家多多補充~

LCS小結(O O 吽吽)

lcs 最長公共子串行也稱作最長公共子串 不要求連續 打個比方說,a君有乙個字串 qazwbx,b君也有乙個字串 azwsxq,那麼我們可以說a君和b君的最長公共子串行為 azwx,長度為4,這樣看來好像挺簡單的,但是如果字串很長或者比較的字串個數很多,要求出公共的而且是最長的就能比較困難了,為了方...

OO第一單元作業小結

oo第一單元作業小結 在本次部落格的寫作中,我運用intellij旗艦版的diagrams功能繪製類圖,用metricsreloaded外掛程式進行 複雜度分析。1 基於度量來分析自己的程式結構 第一次作業 第一次作業的流程圖如下 第一次作業的結構比較混亂,因為較少接觸物件導向語言的緣故,所以程式寫...

(萌O O)雜湊知識點小結

噶嗚 先來了解一下什麼是雜湊吧?當我們要在一堆東西中找到想要的那乙個東西,我們常常通過比較來找,理想的情況是不經過任何比較,一次就能找到,怎麼才能做到這樣呢?那就在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係,我們稱這種對應關係為雜湊函式 小盆友們應該對雜湊有了乙個初步的印象了吧?其實,雜湊...