求最長連續公共子串

2021-06-29 06:02:53 字數 644 閱讀 6470

說到求最長公共子串首先想到的是逐個子串比較,但是那樣的話演算法的複雜度太高,後來就想到用矩陣的方法去解決 思路如下:

比如字元創a:abcdefg 和字串b:bdeabc  建立矩陣如下圖所示

發現如果連續的斜線值為1的長度最長的話 則為最長公共子串 則abc為最長公共子串  ,

那我們可把矩陣進化為:

我們在計算矩陣的過程中判斷如果它的值等於左上角的值+1 

然後遍歷矩陣找出最大值 則找到最長公共子串的結尾字元 往前移動該塊的值 則為最長公共子串的起始位址;

**如下:

void findlstring(string &s1, string s2)

for (int ii = 0; ii < i; ii++)

}else

}} }

for (int k = 0; k < i; k++)

for (int ii =pos-sum+1; ii

求最長連續公共子串行和最長連續子字串

問題的關鍵是如何定義子問題。假設有 xm x1 x2 x3 xm yn y1 y2 y3 yn 1.最長公共子串行 不必連續 定義f m,n 為xm和yn之間最長的子串行的長度 於是有f m,0 f 0,m 0 如果xm yn,則f m,n max 如果xm yn,則f m,n f m 1,n 1 ...

最長公共連續子串和最長連續公共子串行

用二維陣列c i j 記錄串x1 x2 x i x1x2 xi與y 1y 2 y j y1y2 yj 的lcs長度,則可得到狀態轉移方程c i,j 0c i 1 j 1 1max c i,j 1 c i 1,j i 0 orj 0i,j 0a ndxi y j i,j 0a ndxi y j pub...

最長公共連續子串

這是兩個字串,所以狀態轉移矩陣肯定是二維矩陣。另外dp i j 代表的意思不是分別乙個字串的前 i 個和另乙個字串的前 j 個字元裡面的最長連續子串。而是以a i 和b j 為末端的公共連續子串長度。如果dp i j 代表是目前最長連續子串,那麼遞推公式就寫不出來,因為不知道dp i j 中公共子串...