動態規劃之最長公共子串行(演算法導論)

2021-06-26 07:59:37 字數 1046 閱讀 9276

1、一些概念

子串行:就是將原序列中的0個或多個元素去掉之後得到的序列。子串行不一定在原序列中連續。比如:x=中的乙個子串行可以為:,也可以是: 。

2、問題描述

現有兩個序列分別為:x=和y=.求x和y的長度最大的公共子串行。

3、問題解析

要尋找x和y的最長公共子串行,可以從前往後找,也可以從後向前找,若存在多個長度相同的最長公共子串行,則這兩種方法找出來的序列可能不一樣,但都是最長的公共子串行。

現在主要介紹從後向前找的方法,從前向後找也類似。對於兩個序列x和y,長度分別為:len1和len2,假設其最長公共子串行為z,其長度為len,查詢過程如下:

1)若x[len1]==y[len2],則將x[len1]賦給z[len],然後x和y同時向前移動乙個位置。

2)若x[len1]!=y[len2],且x[len1] != z[len],這時x[len1-1]和y的最長公共子串行為z。

3)若x[len1] != y[len2],且y[len2] != z[len],這時x和y[len2-1]的最長公共子串行為z。

在此,我們使用陣列c[i, j]來表示x[i]和y[j]的最長公共子串行的長度。則z的長度為c[len1, len2]。根據以上分析,我們可以得出

if i==0 or j==0, 則c[i, j]=0;

if i,j >0 且xi == yj,則c[i, j] = c[i-1, j-1]+1;

if i,j >0 且xi != yj,則c[i, j] = max

else if(c[i-1][j] > c[i][j-1])

else

}maxlen = c[len1][len2];

return maxlen;

}//time: o(len1+len2)

void lcs_print(char *str1, int len1, int len2)

else if(c[len1][len2] == c[len1][len2-1])

else }

int main()

return 0;

}

動態規劃之最長公共子串行演算法

動態規劃之最長公共子串行演算法 演算法思想 假設x x1,x2,xm y static void init xy void getchar for i 1 i n i getchar static void lcs length void else if c i 1 j c i j 1 else p...

動態規劃之最長公共子串行

最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...

動態規劃之最長公共子串行

給出兩個字串,求出這樣的一 個最長的公共子串行的長度 子串行 中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的 先後順序一致。sample input abcfbc abfcab programming contest abcd mnp sample output 4 2 0對於動...