最長公共子串行和最長公共子串 C語言實現

2021-10-06 01:34:54 字數 1355 閱讀 9380

核心思想:

利用動態規劃的思想,通過設定乙個臨時陣列t,其中t[i][j]表示,以str1[i]作為末尾和以str[2]作為末尾的最長公共子串行或者子串的長度。

演算法步驟:

(1)將輸入的兩個字串分別存在陣列a和b中,同時設定兩個臨時陣列t1和t2,第乙個t1[i][j]表示a陣列前i-1個字串和b陣列前j-1個字串的最大公共子串行;第二個t2[i][j]表示a陣列前i-1個字串和b陣列前j-1個字串的最大公共子串;

(2)循壞遍歷兩個字串的所有字元,當遍歷到第乙個字串的第i個字元,第二個字串的第j個字元時:

對於最長公共子串行:

若a[i]=b[j],則t1[i][j]=t1[i-1][j-1]+1;

若a[i]!=b[j],則t1[i][j]=max

對於最長公共子串:

若a[i]=b[j],則t2[i][j]=t2[i-1][j-1]+1;

若a[i]!=b[j],則t2[i][j]=0。

(3)t1陣列最右下角的便是最長公共子串行的長度;而t2陣列中最大的元素才是最長公共子串的長度。

注意:子串行:從字串中順序地取出字元組成的字串;

子串:從字串中連續地取出字元組成的字串。

例項以及**

//定義全域性變數

int t1[20]

[20]=

,t2[20]

[20]=

;char a[20]

,l1=

1,b[20]

,l2=

1;

//儲存輸入,初始化臨時二維陣列

void

input()

ch=getchar()

;while

(ch!=

'\n'

)}

//對於a[i]是否等於b[j]的處理

void

lcdsubsequence()

}}

//對於a[i]是否等於b[j]的處理

void

lccsubsequence()

}}

//分別輸出

void

output()

int

main()

執行結果:

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

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