字串演算法之最長公共子串行

2021-07-11 15:29:15 字數 740 閱讀 5302

最長公共子串行,即 longest common subsequence,lcs。乙個字串刪掉任意字元後所形成的字串,不要求連續,注意和最長公共子串的區別。

lcs的應用:**查重,圖形相似度比較,基因序列比較等。

暴力求解:

分別求出x、y串的子串行,而後進行搜尋比較,容易得到該演算法複雜度為o(2^m · 2^n ),顯然不可取

動態規劃:

設有兩個字串x[1....m],y[1....n],求其最長公共子串

假設xi yi為兩個字串從1開始數的第i個字元,若xm=yn,則xm必在最長公共子串行中,即

設z為最長公共子串,那麼 z = lcs(xm,yn)= lcs(xm-1, yn-1) + xm;

若不相等,則 z =  max;

則使用二維陣列c[m][n], c[i][j]記錄序列xi和yi的最長公共子串行的長度,當i或者j等於0時,公共子串行長度為0,即c[i][j]=0;

那麼:

實現**:

如果是要求出最長遞增序列的,可將原序列排序後求兩個序列的最長公共子串行。

動態規劃之最長公共子串行 最長公共子串

題目 如果字串1的所有字元按其在字串中的順序出現在另外乙個字串2中,則字串1稱之為字串2的子串行。注意,並不要求子子串行 字串1 的字元必須連續出現在字串2中。請編寫乙個函式,輸入兩個字串,求它們的最長公共子串,並列印出最長公共子串行。例如 輸入兩個字串bdcaba和abcbdab,字串bcba和b...

最長公共字串和最長公共子串行

給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...

演算法之最長公共子串行問題

一 問題描述 最長公共子串行 longest common sequence 什麼是子串行呢?即乙個給定的序列的子串行,就是將給定序列中零個或多個元素去掉之後得到的結果。子串行每個元素的下標嚴格遞增。如上圖,給定的字串行 它的子串行示例 即元素b,d,g,h被去掉後,保持原有的元素序列所得到的結果就...