使用動態規劃求解最長公共子串行(LCS)

2021-07-11 03:17:46 字數 807 閱讀 3585

給出兩個字串,求其最長公共子串行的長度(lcs)

如:

abcdefghij

badfhcajie

其lcs為a、d、f、h、j,則輸出5

注意子串行和子串是不同的,子串必須連續,子串行只要按順序就行了,中間可以跳過某個字元。

設字串a的長度為m,b的長度為n,suba(i)表示a的前i個字元的子串

則lcs(a,b)為:

1)若a、b的最後乙個字元相同,則為lcs(suba(m-1),subb(n-1))+1

2)  若a、b的最後乙個字元不同,則為lcs(a,subb(n-1))和lcs(suba(m-1),b)中最大的那個

3)若a、b中有乙個為空,則為0。

將a、b所有lcs的長度值存入乙個二維陣列c[m][n]中,m、n為a、b的子串長度。

如在上面的例子中,

c[0][0]=0,c[0][1]=0,c[1][0]=0

c[1][1]表示a的子串'a'與b的子串'b'的lcs,為0

c[1][2]表示a的子串'a'與b的子串'ba'的lcs,為1

c[2][1]表示a的子串'ab'與b的子串'b'的lcs,為1

c[2][2]表示a的子串'ab'與b的子串'ba'的lcs,為1

當陣列c填滿後,輸出c[m][n]即為字串a、b的lcs。

**:(c++)

#include

#include

usingnamespacestd;

int main()

cout << c[m][n] << endl;

}return0; }

動態規劃求解最長公共子串行(LCS)

看了 演算法導論 中文第二版p208的動態規劃求解lcs問題,覺得很讚,但總覺得算導寫得有些晦澀,希望自己能寫得簡單易懂一些,純當鍛鍊了,歡迎指導交流。首先,子串行和子串是不一樣的。子串是連續的,而子串行中的元素組成可以是不連續的,但元素的位置下標一定是遞增的。以乙個字串s abcdef 為例,字串...

最長公共子串行 動態規劃求解

問題 例如 x y 那麼,二者的最長公共子串行是,長度為4。我們首先需要搞清楚以下兩個概念 最長公共子串行 vs 最長公共子串 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。上述問題中的最長公共子串行與最長公共子串是一樣的。但是再舉例x y 二者的最長公共...

ACM 最長公共子串行 動態規劃求解

最長公共子串行問題 給你兩個字串a m b n 求出他們的公共子字串的長度 子字串不需要再原字串中連續 這個問題的一般想法是 1.找出a m 中的每個子字串 2.看其是否也能存在在b n 中 3.找出公共子字串中最大的乙個。然而這個方法對於計算機來說實在是過於複雜,比較好的方法是使用動態規劃的方法 ...