最長公共子串行問題

2021-09-07 03:18:16 字數 1614 閱讀 8570

最長公共子串行:

給定乙個序列x=,另乙個序列z=滿足如下條件時稱為x的子串行,即存在乙個嚴格遞增的x的下標序列對所有j=1,2...k滿足xi=zj。給定兩個序列x,y,如果既是x的子串行又是y的子串行,那就稱為x,y的公共子串行。最長公共子串行就是所有子串行中最長的乙個或幾個。

用動態規劃法來解最長公共子串行問題:

1.刻畫最長公共子串行的特徵

令x=,y=,z=是x,y的公共子串行。

lcs的最優子結構為:

1.if xm==yn 則zk==xm==yn且zk-1是xm-1,yn-1的lcs

2. if xm != yn 那麼zk!=xm意味著z是xm-1和y的lcs

3.if xm != yn 那麼zk!=yn意味著z是x和yn-1的lcs

2.遞迴解

定義c[i][j表示xi和yjlcs長度,有如下公式:

0            i==0 || j==0

c[i][j] =          c[i-1][j-1]+1      i,j>0&&xi==yj

max(c[i][j-1], c[i-1][j])       i,j>0&&xi!=yj

3.計算lcs長度

用b[i][j]來儲存子問題的最優解

偽碼:(演算法導論)

c[i][j]和吧b[i][j]的跟蹤

4.構造lcs

偽碼:

實現**:

package

dp_lcs;

/***最長公共子串行

*@author

wxisme

*@time 2015-10-22 下午4:49:44 */

public

class

solve_lcs

else

if(c[i-1][j] >= c[i][j-1])

else}}

}/*** 構造lcs

* @param

i *

@param

j

*/public

static

void print_lcs(int i, int

j)

else

if(b[i][j] == 2)

else}}

測試資料:

public

static

void

main(string args) ;

y = new

char;

ret.lcs_length();

ret.print_lcs(x.length, y.length);

}

結果:

bcba
參考演算法導論第三版

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...