題目描述:
我們有兩個字串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問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...