LCS最長公共子串行 c

2021-10-05 21:45:26 字數 1409 閱讀 4471

題目描述:

我們有兩個字串m和n,如果它們的子串a和b內容相同,則稱a和b是m和n的公共子串行。子串中的字元不一定在原字串中連續。

例如字串「abcfbc」和「abfcab」,其中「abc」同時出現在兩個字串中,因此「abc」是它們的公共子串行。此外,「ab」、「af」等都是它們的字串。

現在給你兩個任意字串(不包含空格),請幫忙計算它們的最長公共子串行的長度

輸入描述:

輸入包含多組資料。

每組資料報含兩個字串m和n,它們僅包含字母,並且長度不超過1024

輸出描述:

對應每組輸入,輸出最長公共子串行的長度。

示例:

輸入

abcfbc abfcab

programming contest

abcd mnp輸出4

20

解題思路:

1、乙個簡單的例子:

解釋:1、填表

a和a的最大公共子串數目為1

a和ab的最長公共子串數目為1

……ac和a的最長公共子串為1

ac和ab的最長公共子串為1

……以此類推計算上述該錶

2、推導狀態轉移方程

設上述二維陣列為dp[5][6]

右下角為最長公共子串行長度及題解

狀態轉移方程為:

dp[i][j]=dp[i-1][j-1]+1 (a[i]=b[j])

dp[i][j]=max(dp[i-1][j],dp[i][j-1])

**:

#include

#include

#include

#include

using

namespace std;

intmain()

else

*/dp[0]

[0]=

(a[0

]== b[0]

)?1:

0;for(

int i =

1; i < alen; i++

)for

(int j =

1; j < blen; j++

)for

(int i =

1; i < alen; i++)}

} cout << dp[alen -1]

[blen -1]

<

}return0;

}

LCS 最長公共子串行

問題描述 我們稱序列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最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...