最長公共子串行LCS演算法

2021-10-04 06:37:44 字數 3345 閱讀 8226

思路:

對所有子問題s1[1-i]和s2[1-j]進行求解。s1[1-i]表示1~i範圍的s1子串,s2[1-j]表示1-j範圍的s2子串。

舉例:

#define n1 8

#define n2 9

int s1[n1+1]

=;int s2[n2+1]

=;

其所有子問題如下:

s1[1~1],s2[1-1],求其最長公共子串行長度

s1[1~1],s2[1-2],求其最長公共子串行長度

s1[1~1],s2[1-2],求其最長公共子串行長度

s1[1~1],s2[1-3],求其最長公共子串行長度

s1[1~1],s2[1-4],求其最長公共子串行長度

s1[1~1],s2[1-5],求其最長公共子串行長度

s1[1~1],s2[1-6],求其最長公共子串行長度

s1[1~1],s2[1-7],求其最長公共子串行長度

s1[1~1],s2[1-8],求其最長公共子串行長度

s1[1~1],s2[1-9],求其最長公共子串行長度

s1[1~2],s2[1-1],求其最長公共子串行長度

s1[1~2],s2[1-2],求其最長公共子串行長度

s1[1~2],s2[1-3],求其最長公共子串行長度

s1[1~2],s2[1-4],求其最長公共子串行長度

s1[1~2],s2[1-5],求其最長公共子串行長度

s1[1~2],s2[1-6],求其最長公共子串行長度

s1[1~2],s2[1-7],求其最長公共子串行長度

s1[1~2],s2[1-8],求其最長公共子串行長度

s1[1~2],s2[1-9],求其最長公共子串行長度

s1[1~3],s2[1-1],求其最長公共子串行長度

s1[1~3],s2[1-2],求其最長公共子串行長度

s1[1~3],s2[1-3],求其最長公共子串行長度

s1[1~3],s2[1-4],求其最長公共子串行長度

s1[1~3],s2[1-5],求其最長公共子串行長度

s1[1~3],s2[1-6],求其最長公共子串行長度

s1[1~3],s2[1-7],求其最長公共子串行長度

s1[1~3],s2[1-8],求其最長公共子串行長度

s1[1~3],s2[1-9],求其最長公共子串行長度

s1[1~4],s2[1-1],求其最長公共子串行長度

s1[1~4],s2[1-2],求其最長公共子串行長度

s1[1~4],s2[1-3],求其最長公共子串行長度

s1[1~4],s2[1-4],求其最長公共子串行長度

s1[1~4],s2[1-5],求其最長公共子串行長度

s1[1~4],s2[1-6],求其最長公共子串行長度

s1[1~4],s2[1-7],求其最長公共子串行長度

s1[1~4],s2[1-8],求其最長公共子串行長度

s1[1~4],s2[1-9],求其最長公共子串行長度

s1[1~5],s2[1-1],求其最長公共子串行長度

s1[1~5],s2[1-2],求其最長公共子串行長度

s1[1~5],s2[1-3],求其最長公共子串行長度

s1[1~5],s2[1-4],求其最長公共子串行長度

s1[1~5],s2[1-5],求其最長公共子串行長度

s1[1~5],s2[1-6],求其最長公共子串行長度

s1[1~5],s2[1-7],求其最長公共子串行長度

s1[1~5],s2[1-8],求其最長公共子串行長度

s1[1~5],s2[1-9],求其最長公共子串行長度

s1[1~6],s2[1-1],求其最長公共子串行長度

s1[1~6],s2[1-2],求其最長公共子串行長度

s1[1~6],s2[1-3],求其最長公共子串行長度

s1[1~6],s2[1-4],求其最長公共子串行長度

s1[1~6],s2[1-5],求其最長公共子串行長度

s1[1~6],s2[1-6],求其最長公共子串行長度

s1[1~6],s2[1-7],求其最長公共子串行長度

s1[1~6],s2[1-8],求其最長公共子串行長度

s1[1~6],s2[1-9],求其最長公共子串行長度

s1[1~7],s2[1-1],求其最長公共子串行長度

s1[1~7],s2[1-2],求其最長公共子串行長度

s1[1~7],s2[1-3],求其最長公共子串行長度

s1[1~7],s2[1-4],求其最長公共子串行長度

s1[1~7],s2[1-5],求其最長公共子串行長度

s1[1~7],s2[1-6],求其最長公共子串行長度

s1[1~7],s2[1-7],求其最長公共子串行長度

s1[1~7],s2[1-8],求其最長公共子串行長度

s1[1~7],s2[1-9],求其最長公共子串行長度

s1[1~8],s2[1-1],求其最長公共子串行長度

s1[1~8],s2[1-2],求其最長公共子串行長度

s1[1~8],s2[1-3],求其最長公共子串行長度

s1[1~8],s2[1-4],求其最長公共子串行長度

s1[1~8],s2[1-5],求其最長公共子串行長度

s1[1~8],s2[1-6],求其最長公共子串行長度

s1[1~8],s2[1-7],求其最長公共子串行長度

s1[1~8],s2[1-8],求其最長公共子串行長度

s1[1~8],s2[1-9],求其最長公共子串行長度

所有子問題的答案都存在二維陣列m中。

利用二維陣列逆向輸出答案,具體過程直接看**就好。

**實現如下:

#include

using

namespace std;

intmain()

;int s2[n2+1]

=;int m[9]

[10]=

;for

(int i =

1; i <= n1; i++

)else

else}}

}// 輸出陣列m

for(

int i =

0; i <= n1; i++

)putchar(10

);}// 輸出答案

cout <<

"倒序輸出答案:"

;int i = n1, j = n2;

while

(i >=

1&& j >=1)

else

else}}

putchar(10

);return0;

}

參考:

演算法 最長公共子串行LCS

演算法 最長公共子串行 子串行的定義 如果z是a的子串行,則a中包含z的所有排列元素,且這些元素在各自排列中的順序是一致的 例如z a 最優子結構 設c是lcs的長度 則if i 0 j 0 c i,j 0 else if x i y j c i,j c i 1,j 1 1 else if x i ...

LCS演算法最長公共子串行

問題 求解x和y的最長公共子串行 解析先處理序列的前 公式 個元素組成的子串行,然後再依次往上加後面的元素。即,用 公式 表示序列1和序列2前 公式 個元素的lcs長度,然後將 公式 用 公式 至 公式 表示。但是這個拆分有個問題 序列1和序列2的長度可能不等。這個問題很好解決,我們可以在較短序列的...

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...