若給定序列x=,則另一串行z= 是x的子串行 是指存在乙個嚴格遞增下標序列使得對於所有j=1,2,…,k有:zj=xij。
例如,序列z=是序列x=的子串行,相應的遞增下標序列為。給定2
個序列x和y
,當另一串行z既是
x的子串行又是
y的子串行時,稱
z是序列x和
y的公共子串行。
例如,序列x=,
y=的子串行,是x
與y的公共子串行,但不是最長公共子串行;也是x
與y的公共子串行,但它是x與
y的最長公共子串行,因為x與
y沒有長度大於
4的公共子串行。 給定
2個序列
x=和
y=,找出x和
y的最長公共子串行。
輸入:序列x的長度m,序列y的長度n;序列x各個元素,序列y各個元素
輸出:x與y的最長公共子串行,最長公共子串行的長度。
執行結果:
解法一:窮舉法,列舉出
x所有可能的子串行,並檢查它是否也是
y的子串行,從而確定它是否為公共子串行,在此過程中記錄最長的公共子串行
演算法複雜度分析: 2從x
中任意取
l個元素構成子串行,共有2m
種不同子集。
解法二:
嘗試用動態規劃求解
一、最長公共子串行結構
設序列x = 和y= 的最長公共子串行為z = 則
(1)若xm = yn,zk = xm = yn,且zk-1是xm-1和yn-1的最長公共子串行。
(2)若xm!=yn且zk != xm,則z是xm-1和y的最長公共子串行。(反證法:z是xm-1和y的公共子串行,但不是最長的)
(3)若xm!=yn且zk !=yn,則z是x和yn-1的最長公共子串行。
2個序列的最長公共子串行包含了它們字首的最長公共子串行。
最長公共子串行問題有最優子結構性質。
二、子問題的遞迴結構
由最優子結構性質建立子問題最優值的遞迴關係 用
c[i][j]
記錄序列x和
y的最長公共子串行的長度,其中, xi
=;yj
=。 當
i=0或
j=0時,空序列是xi
和yj的最長公共子串行。故
c[i][j]=0。
其他情況下,由最優子結構性質可建立遞迴關係如下。
三、計算最優值
直接利用遞迴式的演算法是指數時間的,由於在所考慮的子問題空間中,總共有
θ(mn)(θ
是上下界符號)個不同的子問題,因此,用動態規劃演算法自底向上地計算最優值能提高演算法的效率。
b[i][j]記錄c[i][j]是由哪個子問題得到的
void lcslength(int m, int n, char *x, char *y, int c[maxn], int b[maxn])
else if(c[i-1][j] >= c[i][j-1])
else}}
四、構造最長公共子串行lcslength
只是計算出最優值,並未給出最優解,然而陣列
b可用於快速構造兩個序列的最長公共子串行:
b[i][j]=1
時表示xi和
yj的最長公共子串行是由x
i-1和
yj-1
的最長公共子串行加上xi
所得到(斜)
; b[i][j]=2
時表示xi和
yj的最長公共子串行與x
i-1和yj
的最長公共子串行相同
(上);
b[i][j]=3
時表示xi和
yj的最長公共子串行與x
i和yj-1
的最長公共子串行相同
(左)。 根據
b的內容列印出最長公共子串行
void lcs(int i, int j, char *x, int b[maxn])
else if(b[i][j] == 2)
lcs(i-1, j, x, b);
else
lcs(i, j-1, x, b);
}
動態規劃 最長公共子串行問題
最長公共子串行問題 longest common subsequence problem 簡稱lcs問題。題目為給定兩個序列x y求它們的lcs 最長公共子串行 這裡的子串行z的定義為 z中的元素既在x中也在y中,並且他們在x y中滿足嚴格的下標為乙個增序列 假設下標從左到右依次增大 另外,不要求z...
最長公共子串行問題 動態規劃
給定兩個字串s1s2.sn和t1t2.tn。求出這兩個字串最長的公共子串行 輸入 abcicba abdkscab 輸出 abca 定義dp i j 為s1 si和t1 tj對應的lcs的長度 s1 si 1和t1 tj 1對應的公共子列有三種情況 當si 1 tj 1時,在s1 si和t1 tj的...
最長公共子串行問題(動態規劃)
time limit 1000ms memory limit 65536kb problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。output 每組輸出一行,表示所求得的最長公...