動態規劃 查詢最長公共子串行

2021-09-23 10:47:52 字數 2568 閱讀 8312

乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。

例:如下有兩個字串:

x:a b c b d a b

y:b d c a b a

查詢它們最長公共子串行。

則它們公共子串行有(b d a b)(b d a b) (b c b a)

找最長公共子串行長度lcs(x,y)

lcs(x[0],x[0])=0

lcs(x[1],x[1])=0 如果不相等為0

lcs(x[2],x[2])=0分情況:

lcs(x[1],x[2])=0

lcs(x[2],x[1])=1

此時lcs(x[2],x[2])=1 即取兩種情況的最大值

lcs(x[3],x[3])=2

lcs(x[4],x[4])=0分情況:

lcs(x[3],x[4])=2

lcs(x[4],x[3])=2

此時lcs(x[4],x[4])=2

lcs(x[5],x[5])=0分情況:

lcs(x[4],x[5)=3

lcs(x[5],x[4])=2

此時lcs(x[4],x[4])=3

。。。。。剩下的以此類推

偽**如下:

lcs(x,y,i,j)

key1:窮舉法

窮舉法需要遍歷出所有的可能,在這不考慮。

key2: 遞迴方法

static

intf

(char

a,char

b,int i,

int j)

else

if(a[i]

== b[j]

)else

}static

intmax

(int a,

int b)

public

static

void

main

(string[

] args)

for(

int i =

0; i < t2.length; i++

) system.out.

println(f

(s1.

tochararray()

, s2.

tochararray()

,4,4

));}

key3:備忘錄法
static

intf

(char

a,char

b,int i,

int j,

int[

] bak)

else

if(a[i]

== b[j]

)else

return bak[i]

[j];

}static

intmax

(int a,

int b)

public

static

void

main

(string[

] args)

for(

int i =

0; i < t2.length; i++

)int

bak =

newint

[c1.length]

[c2.length]

;for

(int i =

0; i < c1.length; i++)}

system.out.

println(f

(c1, c2, c1.length -

1, c2.length -

1, bak));

}

key4:自底向上
static

intf

(char

a,char

b,int i,

int j,

int[

] bak)

else

if(a[ii]

== b[jj]

)else}}

return bak[i]

[j];

}static

intmax

(int a,

int b)

public

static

void

main

(string[

] args)

for(

int i =

0; i < t2.length; i++

)int

bak =

newint

[c1.length]

[c2.length];

system.out.

println(f

(c1, c2, c1.length -

1, c2.length -

1, bak));

}

動態規劃 最長公共子串行

問題描述 我們稱序列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 的乙...