最長公共子串行

2021-06-17 18:36:53 字數 898 閱讀 5685

最長公共子串行,英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。而最長公共子串(要求連續)和最長公共子串行是不同的。

動態規劃的乙個計算兩個序列的最長公共子串行的方法如下:

以兩個序列 x、y 為例子:

設有二維

陣列f[i,j] 表示 x 的 i 位和 y 的 j 位之前的最長公共子串行的長度,則有:

f[1][1] = same(1,1);

f[i,j] = max

其中,same(a,b)當 x 的第 a 位與 y 的第 b 位相同時為「1」,否則為「0」。

此時,二維陣列中最大的數便是 x 和 y 的最長公共子串行的長度,依據該

陣列回溯,便可找出最長公共子串行。

該演算法的空間、

時間複雜度均為o(n^2),經過優化後,

空間複雜度可為o(n)。

**如下:

#include #include #include using namespace std;

#define n 1005

int n, a[n][n], len1, len2;

char str1[n], str2[n], res[n];

void display(int x, int y, int th, int max_len)//列印所有的最長公共子串行

// display(len1, len2, a[len1][len2], a[len1][len2]);

cout << a[len1][len2] << endl;

}return 0;

}

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...