LCS 最長公共子串行

2021-05-27 15:33:18 字數 1091 閱讀 2702

問題描述

我們稱序列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的最大公共子串行,也就是說要找

到乙個最長的序列 z,使得 z 既是x的子串行也是 y的子串行。

解題思路

很容易分析出遞推關係:(s1,s2為兩個字串,i,j分別為他們的串字元下標)用 s1i 表示 s1 的前 i

個字元所構成的子串, s2j表示 s2 的前 j 個字元構成的子串,maxlen(i, j)表示 s1i  和 s2j的最長公共子串行的長度

if( i ==0 || j == 0 )

else if( s1[i] == s2[j] ) 

maxlen(i, j) = maxlen(i-1, j-1 ) + 1;

else

非遞迴解法:(動態規劃)

#define maxsize 20

#define max(a,b) (a)>(b)?(a):(b)

int dp_lcs()

for(j=0;j<=len2;j++)

//dp to run lcs

for(i=1;i<=len1;i++)else

}}//end main_for

return maxlen[len1][len2];

}

遞迴解法:

#includeint lcs(char *str1,char *str2)elseelse

}}int main()

LCS最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...

最長公共子串行(LCS)

首先要明確的是子串行的概念,注意啦,子串行不等於子串。子串行是乙個字串s去掉零個或者多個字元後所剩下的字串就叫做子串行。最長公共子串行的意思就是尋找兩個給定字串的的子串行,該子串行在兩個字串中以相同的次序出現,但是不一定是連續的。連續的那是子串 例如序列x abcbdab,y bdcaba。序列bc...