找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。其實這又是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧:"bab"和"caba"(當然我們現在一眼就可以看出來最長公共子串是"ba"或"ab")
b a b
c 0 0 0
a 0 1 0
b 1 0 1
a 0 1 0
不過在二維矩陣上找最長的由1組成的斜對角線也是件麻煩費時的事,下面改進:當要在矩陣是填1時讓它等於其左上角元素加1。
b a b
c 0 0 0
a 0 1 0
b 1 0 2
a 0 2 0
**如下:
#include#include#include#includeusing namespace std;
//str1為橫向,str2這縱向
const string lcs(const string& str1,const string& str2)}}
// {
// vector::iterator iter=arr.begin();
// while(iter!=arr.end())
// cout<<*iter++;
// cout<
最長公共子串LCS
找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。其實這又是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公共子串是 ba 或 ab b a b c 0 0 0 a ...
LCS求最長公共子串
問題描述 給兩個子串行a和b,求長度最長的公共子串行,如1,5,2,6,8,7和2,3,5,6,9,8,4的最長公共子串行為5,6,8另乙個解為2,6,8求出這樣的子串行最長是多少?狀態轉移方程 對a1,a2 ai和b1,b2,bj 當a i b j 時,d i,j d i 1,j 1 1 否則d ...
最長公共連續子串LCS
csdn 定義dp i j 字串s1和s2的最長公共連續子串的最後乙個字元與這兩個字串的最後乙個字元相等的情況下,這個lcs的長度,狀態轉移方程為 注意觀察,a i b j 的情況下,dp i j 也等於0,這是子串行和子串在狀態轉移方程上的區別。那麼,我們通過兩層迴圈,計算出dp的值,然後找到其中...