前言:學習過的知識,只要不經常使用就會忘記,所以在此寫部落格,記錄下來,方便自己,也可能有利於他人。
最長公共子串行(lcs)問題。
1.什麼是最長公共子串行?
最長公共子串行,英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
注:最長公共子串行和最長公共子串的區別:前者(公共子串行)不必連續,後者(字串)必須是連續的
如:abccfg與adcf:最長公共子串行為:acf,而最長公共字串為:cf。(一目了然了吧)。
2.解決方法
1).求lcs肯能最先想到的就是窮舉法,如x和y兩個序列,通過窮舉x的每個子串行,看是否在y中,並選擇最長的序列即為最後結果,但是此方法的時間複雜度較大,一般不用此方法。
如x的乙個子串行相對應下標為{1,2,3.....n},那麼x共有2^n個子序列(注意包含空序列),y也同理為2^m個,所以其時間複雜度為o(2^n*2^m)。
2).動態規劃法求解
關於此方法的詳細解答已經給出了超詳細的描述。此處根據下述思想寫出**。(原文中沒有列印出所有的最長公共子串行,此處稍作修改,列印出所有子串行)
最長公共子串行的結構有如下表示:
設序列x=1, x2, …, xm>和y=1, y2, …, yn>的乙個最長公共子串行z=1, z2, …, zk>,則:
若xm=yn,則zk=xm=yn且zk-1是xm-1和yn-1的最長公共子串行;
若xm≠yn且zk≠xm ,則z是xm-1和y的最長公共子串行;
若xm≠yn且zk≠yn ,則z是x和yn-1的最長公共子串行。
其中xm-1=1, x2, …, xm-1>,yn-1=1, y2, …, yn-1>,zk-1=1, z2, …, zk-1>。
[cpp]view plain
copy
#include
using
namespace
std;
#define x 100 //串的最大長度
#define y 100
char
result[x];
//儲存序列的結果
intcount=0;
//記錄lcs的個數
/*功能:返回最長序列的長度
x:字串串x
y:字串y
b:標誌陣列
xlen:字串x的長度
ylen:字串y的長度
*/int
lcs_length(string x_s,string y_s,
intb[y+1],
intxlen,
intylen)
else
if(c[i-1][j]>c[i][j-1])
else
if(c[i-1][j]
else
} } return
c[xlen][ylen];
} /*功能:列印出lcs
i:字串x的長度
j:字串y的長度
x:字串x
b:標誌陣列
current_len:當前子串行長度
lcs_max_len:最長公共子串行長度
*/void
display_lcs(
inti,
intj,string x_s,
intb[y+1],
intcurrent_len,
intlcs_max_len)
cout<
count++;
return
; }
if(b[i][j]==1)
else
if(b[i][j]==2)
//xm!=zm的情況,(具體參考上述鏈結博文有詳細說明)
display_lcs(i-1,j,x_s,b,current_len,lcs_max_len);
else
if(b[i][j]==3)
//yn!=zm的情況
display_lcs(i,j-1,x_s,b,current_len,lcs_max_len);
else
//相等的情況c[i-1][j]==c[i][j-1]
} intmain()
執行結果如下:
再次推薦此部落格。
cdx 2014.4.25 20:25
最長公共子串行(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 問題 求兩字串行的最長公共字元子串行 問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1 xm 1 序列y y0,y1 yk 1 是x 的子串行,存在x 的乙個嚴格遞增下標序列,i...