最長公共子串行

2022-07-30 14:06:09 字數 1675 閱讀 5591

longest common subsequence,lcs

說明:子串行中的字元與子字串中的字元不同,它們不需要是連續的,例如:

字串1:bdcaba;字串2:abcbdab

最長公共子串行長度為4,最長公共子串行是:bcba

最優子結構

設兩個字串分別是x,y;其中x長度為n,y的長度為m。

lcs(xn,ym)就是求出x、y的最長公共子串行,而其中就有三個子問題:

考慮x與y的最後乙個字元是否一樣,我們可以將情況分為三類:

1.x與y的最後乙個字元一樣,則lcs(xn,ym)=lcs(xn-1,ym-1)+1

2.x與y的最後乙個字元不一樣,lcs(xn,ym)=lcs(xn-1,ym)

2.x與y的最後乙個字元不一樣,lcs(xn,ym)=lcs(xn,ym-1)

重疊子問題

例如當lcs(xn-1,ym)最後的字元不相同時,問題就包含lcs(xn-1,ym-1),lcs(xn-2,ym),所以要使用動態規劃進行記憶化搜尋

**解決

lcs可能存在不唯一的多條路徑:

如果格仔dp[i][j]對應的x[i-1] == y[j-1],則把這個字元放入 lcs 中,並跳入dp[i-1][j-1]中繼續進行判斷;

如果格仔dp[i][j]對應的x[i-1] ≠ y[j-1],則比較dp[i-1][j]dp[i][j-1]的值,跳入值較大的格仔繼續進行判斷;

直到 i 或 j 小於等於零為止,倒序輸出 lcs 。

如果出現dp[i-1][j]等於dp[i][j-1]的情況,說明最長公共子串行有多個,故兩邊都要進行回溯(這裡用到遞迴)。

參考:

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

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