核心思想:
利用動態規劃的思想,通過設定乙個臨時陣列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()
執行結果:![](https://pic.w3help.cc/5d7/ad94afadf0f7a522d63137df294b4.jpeg)
最長公共子串行 最長公共子串
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...