最長公共子串行,英文縮寫為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...