最長公共子串行的定義
(1) 子串行
給定兩個序列x=和序列z=,若存在x的乙個嚴格遞增下標序列,使得對所有j=1,2,...,k,有x ij =z j ,則稱z是x的子串行。如:z=是x=的乙個子串行,相應下標序列為<2,3,5,7>。
(2)公共子串行
對給定的兩個序列x和y,若序列z既是x的的子串行,也是y的子串行,則稱z是x和y的 公共子串行 。如,x=,y=,則序列是x和y的乙個公共子串行。
(3)最長公共子串行
兩個序列的長度最大的公共子串行稱為它們的 最長公共子串行 。如,是上面x和y的乙個公共子串行,但不是x和y的最長公共子串行。最長公共子串行是。怎麼求最長公共子串行?
最長公共子串行問題( longest-common-subsequence,lcs )——求(兩個)序列的最長公共子串行
(1)字首:給定乙個序列x=,對於i=0,1,...,m, 定義x的第i個字首為x i =,即前i個元素構成的子串行。如,x=,則x 4 =,x 0 =φ。
(2)lcs問題的最優子結構性
定理6.2 設有序列x=和y=,並設序列z=為x和y的任意乙個lcs。
a.若x m =y n ,則z k =x m =y n ,且z k-1 是x m-1 和y n-1 的乙個lcs。
b.若x m ≠y n ,則z k ≠x m 蘊含z是x m-1 和y的乙個lcs。
c.若x m ≠y n ,則z k ≠y n 蘊含z是x和y n-1 的乙個lcs。
(3)遞推關係式
記,c[i,j]為字首序列x i 和y j 的乙個lcs的長度。則有
注: 以上情況涵蓋了x m 和y n 的lcs的所有情況。
(4)給出乙個例子
上面黃色標註的並且為左上角標記的字元連起來就是最大公共子串行,即bcba
1動態規劃實現最長公共子串行package
cn.dp;23
/**4
* 最長公共子串行問題5*
6*/78
public
class
test2
23system.out.println();24}
25 system.out.println("最大公共子串行的長度為:" +result[str1.length()][str2.length()]);
26 system.out.println("最大公共子串行為:");
27print_lcs(str1.length(), str2.length());28}
2930
/**31
* 求出最大公共子串行的長度 並記錄構造表資訊
32*
@param
str1
33*
@param
str2
34*/
35static
void
lcs(string str1, string str2)
42for (int i = 0; i <= str2.length(); i++)
45for (int i = 1; i <= str1.length(); i++) else
if(result[i - 1][j] >= result[i][j-1]) else57}
58}59}
6061
/**62
* 列印構造表資訊
63*
@parami64
* @paramj65
*/66
static
void print_lcs(int i, int
j) 70
if(b[i][j] == '↖') else
if(b[i][j] == '↑') else78}
79 }
動態規劃 最長公共子串行
問題描述 我們稱序列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的最大公共子串行,也就是說要...
動態規劃 最長公共子串行
兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...
動態規劃 最長公共子串行
看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...