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
下面的**是求兩個字串的最長公共子串:
int lcs(int n,int m)//n,m分別為兩個字串的長度
for(i=1;i<=n;i++)
else}}
return dp[n][m];
}
第二步:通過回溯求出最長公共子串行
如圖:下面給出逆序輸出最長公共子串的**:
從最後開始,碰到一樣的輸出,不一樣的,往更大的方向跑。其實就是前面生成dp的逆過程。
lcs粗略的講完了,還有很多不足,希望大家多多補充~
————anonymous.pjq
LCS小結(O O 吽吽)
lcs 最長公共子串行也稱作最長公共子串 不要求連續 打個比方說,a君有乙個字串 qazwbx,b君也有乙個字串 azwsxq,那麼我們可以說a君和b君的最長公共子串行為 azwx 長度為4,這樣看來好像挺簡單的,但是如果字串很長或者比較的字串個數很多,要求出公共的而且是最長的就能比較困難了,為了方...
OO第一單元作業小結
oo第一單元作業小結 在本次部落格的寫作中,我運用intellij旗艦版的diagrams功能繪製類圖,用metricsreloaded外掛程式進行 複雜度分析。1 基於度量來分析自己的程式結構 第一次作業 第一次作業的流程圖如下 第一次作業的結構比較混亂,因為較少接觸物件導向語言的緣故,所以程式寫...
(萌O O)雜湊知識點小結
噶嗚 先來了解一下什麼是雜湊吧?當我們要在一堆東西中找到想要的那乙個東西,我們常常通過比較來找,理想的情況是不經過任何比較,一次就能找到,怎麼才能做到這樣呢?那就在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係,我們稱這種對應關係為雜湊函式 小盆友們應該對雜湊有了乙個初步的印象了吧?其實,雜湊...