公共子串行

2021-10-03 02:55:29 字數 2719 閱讀 6642

03 公共子串行

描述我們稱序列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的最大公共子串行,也就是說要找到乙個最長的序列z,使得z既是x的子串行也是y的子串行。

輸入輸入包括多組測試資料。每組資料報括一行,給出兩個長度不超過200的字串,表示兩個序列。兩個字串之間由若干個空格隔開。

輸出對每組輸入資料,輸出一行,給出兩個序列的最大公共子串行的長度。

樣例輸入

abcfbc         abfcab

programming contest

abcd mnp

樣例輸出
4

20

分析

分解問題:

​ 將問題分解為「從開頭到s1 串的第i個字元與到s2 串的第j個字元之間的最長公共子串行」。

找出狀態遷移方程:

如果 s1[

i−1]

==s2

[j−1

]s_1[i-1]==s_2[j-1]

s1​[i−

1]==

s2​[

j−1]

,那麼 max

len(

i,j)

=max

len(

i−1,

j−1)

+1

maxlen(i,j)=maxlen(i-1,j-1)+1

maxlen

(i,j

)=ma

xlen

(i−1

,j−1

)+1這裡的反面條件是本題的難點:如果s1[

i−1]

!=s2

[j−1

]s_1[i-1] !=s_2[j-1]

s1​[i−

1]!=

s2​[

j−1]

,m ax

len(

i,j)

maxlen( i , j )

maxlen

(i,j

)會如何變化呢?

它首先肯定不會小於max

len(

i−1,

j−1)

、max

len(

i,j−

1)、m

axle

n(i−

1,j)

maxlen( i-1 , j-1 )、maxlen( i , j-1 )、maxlen( i-1 , j )

maxlen

(i−1

,j−1

)、ma

xlen

(i,j

−1)、

maxl

en(i

−1,j

),因為比他們多了若干個字元

但是它肯定不可能同時大於max

len(

i,j−

1)、m

axle

n(i−

1,j)

maxlen( i , j-1 )、maxlen( i-1 , j )

maxlen

(i,j

−1)、

maxl

en(i

−1,j

)。假設其同時大於這兩者,那麼其值只能是這兩者的值+1,而其值+1,則只有 s1[

i−1]

、s2[

j−1]

s_1[i-1]、s_2[j-1]

s1​[i−

1]、s

2​[j

−1]分別都在最長子序列中才可能發生,那麼最長子序列的最後一位分別是這倆字元,而這倆字元又不相等,引發了矛盾。

故而我們可以發現 max

len(

i,j)

=max

(max

len(

i,j−

1),m

axle

n(i−

1,j)

)maxlen(i,j)=max(maxlen(i,j-1),maxlen(i-1,j))

maxlen

(i,j

)=ma

x(ma

xlen

(i,j

−1),

maxl

en(i

−1,j

))。 直觀上來說,如果s1[

i−1]

!=s2

[j−1

]s_1[i-1] !=s_2[j-1]

s1​[i−

1]!=

s2​[

j−1]

,我們就只能選取乙個方向繼續前進,而方向的選擇則是:選取較大的

#include

#include

using

namespace std;

string s1, s2;

int dp[

205]

[205];

intmain()

intf

(int loc1,

int loc2)

else

}

公共子串行

最長公共子串行問題 給定2個字串,求其最長公共子串。如abcde和dbada的最長公共字串為bd。動態規劃 dp i j 表示a串前i個和b串前j個的最長公共子串的長度。則若a i b j dp i j dp i 1 j 1 1 否則 dp i j max dp i 1 j dp i j 1 時間複...

dp 公共子串行

描述 我們稱序列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的最大公共子串行,也就是說要...

dp C 公共子串行

給定兩個字串 s1,s2 求它們的 lcs 滿足 s1 leq 10 6,s2 leq 10 3 考場寫了 o s1 s2 成功tle,考慮突破口為 s2 不夠大,考慮轉為判定,設 dp i j 表示原來存在最小的 k 使得 f k i geq j 不存在為 n 1 那麼 dp i j min 然後...