動態規劃 最長公共子串行

2021-05-23 15:59:01 字數 806 閱讀 6227

問題描述

我們稱序列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的字串,表示兩個序列。兩個字串之間由若干個空格隔開。

輸出要求

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

解題思路

如果我們用字元陣列s1、s2存放兩個字串,用s1[i]表示s1中的第i個字元,s2[j]表示s2中的第j個字元(字元編號從1開始,不存在「第0個字元」),用s1i表示s1的前i個字元所構成的子串, s2j表示s2的前j個字元構成的子串,maxlen(i, j)表示s1i 和s2j的最長公共子串行的長度,那麼遞推關係如下:

if( i ==0 || j == 0 ) {

maxlen(i, j) = 0 //兩個空串的最長公共子串行長度當然是0

else if( s1[i] == s2[j] )

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

else {

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

動態規劃 最長公共子串行

兩個序列的最長公共子序 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 的乙...

動態規劃 最長公共子串行

題目大意不再贅述,即判斷兩個字串,求出字串中最長的公共子串行。這是動態規劃的經典題目。include iostream include cstring using namespace std char sz1 1000 abcfbc char sz2 1000 abfcab int maxlen 1...