最長公共子串行 LCS 問題

2021-08-16 22:51:51 字數 1433 閱讀 4566

(1)若xm = yn(最後乙個字元相同),則xm與yn的最長公共子串行zk的最後乙個字元必定為xm(yn)

zk = xm = yn

lcs(xm,yn) = lcs(x(m-1),y(n-1)) + xm

即在xm-1和yn-1的最長公共子串行的基礎上加上相等元素

舉例:xm = yn

string12

3456

7xbd

caba

yabc

bdab

對於字串字串x,y

x3 = y3 = 『c』,lcs(bdc,abc)=lcs(bd,ab)+『c』

x5 = y4 = 『b』,lcs(bdcab,abcb)=lcs(bdca,abc)+』b』

(2)若xm ≠ yn,則(1)lcs(xm,yn) = lcs(x(m-1),y(n)),(2)lcs(xm,yn) = lcs(x(m),y(n-1))

證明:令zk = lcs(xm,yn);由於xm ≠ yn 則zk ≠ xm 與zk ≠ yn至少有乙個必然成立,因為zk ≠ xm,則最長公共子串行zk是xm-1和yn得到的,即zk = lcs(x(m-1),y(n))。同理可證若zk ≠ ym,zk = lcs(x(m),y(n-1))

即, 若xm ≠ yn,則lcs(xm,yn) = max

舉例:xm ≠ yn

string12

3456

7xbd

caba

yabc

bdab

對於字串字串x,y

x2 ≠ y2 ,lcs(bd,ab)=max

x4 = y5 ,lcs(bdca,abcbd)=max

lcs分析總結:lc

s(xm

,yn)

= else }}

system.out.println("substring1:" + substring1);

system.out.println("substring2:" + substring2);

system.out.print("getonelcs:");

int i = 0, j = 0;

while (i < substringlength1 && j < substringlength2) else

if (opt[i + 1][j] >= opt[i][j + 1]) else }}

public

static

void

main(string args)

最長公共子串行(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 如果分別是兩個或多個已知序列的子...