求兩個字串的最長公共子串行

2021-07-11 02:55:41 字數 1197 閱讀 1098

方法

一、遞迴

採用遞迴的方法,**簡單,但是速度比較慢,當字串比較大的時間,多次遞迴會計算一些重複的過程,因此速度很很慢。

#include

using

namespace

std;

int lcslength(int i, int j);

string x, y;

int lenx, leny;

int main()

return0;}

int lcslength(int i, int j)

方法

二、動態規劃

可參考部落格鏈結

引進乙個二維陣列c,用c[i][j]記錄x[i]與y[j] 的lcs 的長度,b[i][j]記錄c[i][j]是通過哪乙個子問題的值求得的,以決定搜尋的方向。

我們是自底向上進行遞推計算,那麼在計算c[i,j]之前,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來。此時我們根據x[i] = y[j]還是x[i] != y[j],就可以計算出c[i][j]。

演算法分析:

由於每次呼叫至少向上或向左(或向上向左同時)移動一步,故最多呼叫(m + n)次就會遇到i = 0或j = 0的情況,此時開始返回。返回時與遞迴呼叫時方向相反,步數相同,故演算法時間複雜度為θ(m + n)。

**實現如下:

#include 

using

namespace

std;

#define maxlen 1002

int c[maxlen][maxlen];

int lcslength(string x, string y, int lenx, int leny, int c[maxlen]);

int main()

return0;}

int lcslength(string x, string y, int lenx, int leny, int c[maxlen])

else

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

return c[lenx][leny];

}

求兩個字串的最長公共子串行

autor baker time 25 5 06 求兩個字串的最長公共子串行。x的乙個子串行是相應於x下標序列的乙個子串行,求解兩個序列的所有子串行中長度最大的,例如輸入 pear,peach輸出 pea。分析 次題可用動態規劃演算法解決。首先定義乙個二維陣列 a a i j m g ddgg dd...

求兩個字串的最長公共子串行

動態規劃解決lcs問題的時間複雜度為o mn 這比簡單的遞迴實現要快多了。空間複雜度是o mn 因為使用了乙個動態規劃表。兩個字串對應的最長公共子串行不一定唯一,這個程式輸出所有的lcs內容。基本思想是 具體參考文章 include include include include include i...

兩個字串的最長公共子串行

解題分析 設兩個序列x y 用lsc x,y 表示最長公共子串行。1.如果xn yn。則該元素一定存在於公共子串行中,所以可化為尋求子問題lsc x 1,y 1 用公式可表示為lsc x,y lsc x 1,y 1 1。2.如果xn yn。則該元素不存在於公共子串行中,所以轉而去尋求兩個子問題,即l...