最長公共子串行問題 LCS

2021-07-29 11:52:23 字數 2118 閱讀 7040

在字母表上,分別給出兩個長度為n和m的字串a和b,這裡a= … 的子串行是乙個形式為 … 的字串,其中每個 都在1和n之間。

例如 =,a=zxyxyz,b=xyyzx那麼xyy同時是a和b的長度是3的子串行。然而。它不是a和b的最長的公共子串行,因為字串xyyx也是a和b的公共的子串行。因此a和b的最長公共子串行的長度是4。

如果i和j都大於0,那麼假設a=」xyxxzxyzxy」和b=」zxzyyzxxyxxz」,求出a和b的最長公共子串行的長度並輸出其中乙個最長公共子串行。

最後求得l[n,m]=6和最長子串行為xy***z

lcs的演算法表示:

輸入:字母表上的兩個字串a和b,長度分別為n和m.

輸出:a和b的最長公共子串行的長度和其中乙個最長子序列。

for i=1 to n

l[i,0]=0

end for

for j=0 to m

l[0,j]=0

end for

for i=1 to n

for j=1 to m

if = then l[i,j]=l[i-1,j-1]+1

else l[i,j]=max

end if

end for

end for

return l[n,m]

lcs的圖表示:假設a=」xyxxzxyzxy」,b=」zxzyyzxxyxxz」

對上面正確結果中的矩陣進行分析:

用c[6]來存公共子串行的字元。

從l[10,12]出發向上走直到遇到第乙個小於l[8,12]的停止,向左走同樣直到遇到第乙個小於l[8,12]的停止. =z把存入c[5]=z, l[8,12]向左上角跳到 l[7,11]

從l[7,11]出發向上走直到遇到第乙個小於l[6,11]的停止,向左走同樣直到遇到第乙個小於l[6,10]的停止.把 =x存入c[4]=x,l[6,10]向左上角跳到 l[5,9]

從l[5,9]出發向上走直到遇到第乙個小於l[4,9]的停止,向左走同樣直到遇到第乙個小於l[4,8]的停止.把 =x存入c[3]=x,l[4,8]向左上角跳到 l[3,7]

從l[3,7]出發向上走直到遇到第乙個小於l[3,7]的停止,向左走同樣直到遇到第乙個小於l[3,7]的停止.把 =x存入c[2]=x,l[3,7]向左上角跳到 l[2,6]

從l[2,6]出發向上走直到遇到第乙個小於l[2,6]的停止,向左走同樣直到遇到第乙個小於l[2,4]的停止.把 =y存入c[1]=y,l[2,4]向左上角跳到 l[1,3]

從l[1,3]出發向上走直到遇到第乙個小於l[1,3]的停止,向左走同樣直到遇到第乙個小於l[1,2]的停止.把 =x存入c[0]=x..到這裡結束得到c

把c輸出得到最長公共子串行

最長公共子串行(LCS)問題

問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...

最長公共子串行問題LCS

乙個給定序列的子串行是指在原序列順序不變的基礎上刪去若干元素後得到的序列。給定兩個序列x和y,當乙個序列z既是x的子串行又是y的子串行時,稱z序列為x和y 的公共子串行。例如,x a,b,c,b,d,a,b y b,d,c,a,b,a 則序列 b,c,a 是x和y的乙個公共子串行,但不是x和y的最長...

最長公共子串行 LCS 問題

前言 學習過的知識,只要不經常使用就會忘記,所以在此寫部落格,記錄下來,方便自己,也可能有利於他人。最長公共子串行 lcs 問題。1.什麼是最長公共子串行?最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子...