乙個給定序列的子串行是指在原序列順序不變的基礎上刪去若干元素後得到的序列。給定兩個序列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的最長子序列。序列【b,c,b,a】是x和y的最長公共子串行。
最長公共子串行問題(lcs):給定兩個子串行x=【x1,x2,x3....xm】,y =【y1,y2,y3,.....yn】,找出x和y的最長公共子串行。
1.最優子結構
設序列x=【x1,x2,x3....xm】,y =【y1,y2,y3,.....yn】的最長公共子串行為z=【z1,z2,z3......zk】
則 (1)若xm = yn則zk = xm = yn,且zk-1是xm-1和yn-1的最長公共子串行;
(2)若xm != yn,且zk != xm,則z是xm-1和y的最長公共子串行;
(3) 若 xm != yn,且zk != yn,則z是x和yn-1的最長公共子串行;
2.子問題遞迴結構
當xm ==yn時,找出xm-1和yn-1的最長公共子串行,當xm !=yn時,必須解決兩個子問題,及找出xm-1和y的乙個最長公共子串行或者x和yn-1的乙個最長公共子串行。
求結果過程中會有子問題重疊。
首先建立子問題最優解的遞迴關係。用c[i][j] 記錄x和y的最長公共子串行的長度。其中xi =,yj = ,當i = 0或j =0 時,空序列是xi和yj的最長公共子串行。此時c[i][j] = 0.
可建立如下遞迴關係:
0 i=0,j=0
c[i][j] = c[i-1][j-1] +1 i,j>0;xi == yj
max i,j >0,xi!=yj
x,y兩個陣列作為輸入,輸出兩個陣列c,b.c[i][j]儲存xi和yj的最長公共子串行的長度,b[i][j]記錄c[i][j]的值是由哪乙個子問題求解得到的。
void lcslength(int m,int n,char *x,char *y,char **c,char **b)
for(j = 0; j <= n; j++)
for(i = 1; i <= m; i++)
else if(c[i-1][j] >= c[i][j-1])
else}}
}
最長公共子串行(LCS)問題
問題描述 見演算法導論p208 p209 前提概念 給定乙個序列x x1,x2,xm 對i 0,1,m,記x的第i個字首為xi x1,x2,xi 故xm x,而x0是個空序列 乙個給定序列的子串行就是該序列去掉0個或多個元素 不一定連續 如bcdb是abcbdab的乙個子串行 基於以上定義,最長公共...
最長公共子串行 LCS 問題
前言 學習過的知識,只要不經常使用就會忘記,所以在此寫部落格,記錄下來,方便自己,也可能有利於他人。最長公共子串行 lcs 問題。1.什麼是最長公共子串行?最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個序列 s 如果分別是兩個或多個已知序列的子...
最長公共子串行問題 LCS
最長公共子串行問題 lcs 問題 求兩字串行的最長公共字元子串行 問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1 xm 1 序列y y0,y1 yk 1 是x 的子串行,存在x 的乙個嚴格遞增下標序列,i...