最長公共子串行

2021-07-30 07:38:56 字數 1141 閱讀 7439

標籤: c語言

動態規劃x

2017-04-08 22:36

358人閱讀收藏 

舉報

演算法(8)

目錄(?)

[+]

給定兩個序列,求出它們的最長公共子串行。 

如:序列x=,y=,則x和y的最長公共子串行為

設兩個序列分別是x=,y=,它們的最長公共子串行為z=。

若xm=yn,則先求xm-1和yn-1的最長公共子串行,再在其尾部加上xm即可得xm和yn的最長公共子串行。

若xm!=yn,則必須分別求xm、yn-1和xm-1、yn的最長公共子串行,其中較長者就是xm和yn的最長公共子串行。

將c陣列的第0行、第0列初始化為0;

從c陣列的第一行、第一列開始,依次從左向右、從上到下填充元素值: 

a)若x[i]==y[j],則c[i][j]=c[i-1][j-1]+1,s[i][j]=1; 

b)若x[i]!=y[j],則分別計算c[i][j-1]、c[i-1][j],將大的那個作為c[i][j];並且,如果c[i-1][j]>=c[i][j-1],則s[i][j]=2;如果c[i-1][j]< c[i][j-1],則s[i][j]=3;

private

int c;

private

int s;

void lcslength(string a, string b)

for( int i=0; i0][i] = 0;

}// 從上到下、從左到右填充c、s陣列

for( int i=1; ifor( int j=1; jif( x[i]==y[j] )

else

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

else }}

}

stringbuilder sb = new stringbuilder();

void clcs( int i, int j )

else

if ( s[i][j]==2 )

else

}

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

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...